首頁 > Java > java教程 > 主體

為什麼我的 forEach lambda 不允許我使用 Java 中的 return 語句退出函數?

Barbara Streisand
發布: 2024-09-26 07:06:42
原創
805 人瀏覽過

Why won

假設你有一籃食物:

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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!