假設你有一籃食物:
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中文網其他相關文章!