為什麼我的 forEach lambda 不允許我使用 Java 中的 return 語句退出函數?
假設你有一籃食物:
List<Food> basket = List.of( new Food("Apple", FRUIT), new Food("Banana", FRUIT), new Food("Carrot", VEGETABLE), new Food("Orange", FRUIT), );
並且要求僅接受僅裝滿水果的籃子。為了滿足這個要求,您決定實作一個 for 迴圈:
private boolean containtsOnlyFruits(List<Food> basket) { for (Food food : basket) { if (food.getFoodType() != FRUIT) { return false; } } return true; }
然後,您記得您一直在學習 Java Lambda 和更實用的方法,因此您決定在 forEach lambda 中編寫相同的內容:
private boolean containtsOnlyFruits(List<Food> basket) { basket.forEach(food -> { if (food.getFoodType() != FRUIT) { return false; } }); return true; }
只是遇到一個錯誤:
意外的回傳值
這是為什麼?
lambda 只不過是個函數。在這種情況下,是一個匿名函數,或者換句話說,是一個沒有名稱的函數。就像任何其他函數一樣,lambda 可以接收參數並期望會傳回一些內容。
當你嘗試從 forEach lambda 返回 false 時,你實際上是在嘗試退出這個匿名函數並輸出一個布林值。但是,forEach 函數預計不會傳回任何結果。這根本不是這個功能的實現方式。
事實上,如果你看一下 forEach 函數的實現,你會發現它接受一個 Consumer:
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
消費者是一個接口,表示接受單一輸入參數且不回傳結果的操作。在此實作中,您可以看到在底層,forEach 函數使用 foreach 循環,執行給定的操作並且不傳回任何內容。
因此,為了滿足函數式方法中的操作,我們需要找到另一個 lambda。這裡有一個很好的候選人:allMatch。
使用 allMatch lambda,我們可以檢查籃子中的所有元素是否都是水果:
private boolean onlyFruits(List<Food> basket) { return basket.stream().allMatch(food -> food.getFoodType() == FRUIT); }
如果是這樣的話,我們的 lambda 將會回傳 true。如果我們看一下 allMatch 的內部:
boolean allMatch(Predicate<? super T> predicate);
我們將看到 allMatch 函數需要一個謂詞。
謂詞是一個函數式接口,就像消費者一樣,但它的工作方式有點不同。 Consumer 表示接受單一輸入參數且不傳回結果的操作,而 Predicate 表示一個參數的謂詞(布林值函數),用於測試物件的條件並傳回布林值(true 或 false) ).
還有其他非常重要的功能介面。你能告訴我它們是什麼以及它們如何運作嗎?
保持好奇!
貢獻
寫作需要時間和精力。 我喜歡寫作和分享知識,但我也有帳單要付。
如果您喜歡我的作品,請考慮透過「買杯咖啡」捐款:https://www.buymeacoffee.com/RaphaelDeLio
或寄給我比特幣:1HjG7pmghg3Z8RATH4aiUWr156BGafJ6Zw
以上是為什麼我的 forEach lambda 不允許我使用 Java 中的 return 語句退出函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...
