forEach ラムダでは Java の return ステートメントで関数を終了できないのはなぜですか?

Barbara Streisand
リリース: 2024-09-26 07:06:42
オリジナル
925 人が閲覧しました

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 ラムダとより関数型のアプローチについて学習していたことを思い出し、同じことを forEach ラムダに記述することにします。

private boolean containtsOnlyFruits(List<Food> basket) {
    basket.forEach(food -> {
        if (food.getFoodType() != FRUIT) {
            return false;
        }
    });
    return true;
}
ログイン後にコピー

エラーが発生しました:

予期しない戻り値

それはなぜですか?

ラムダは単なる関数です。この場合、匿名関数、つまり名前のない関数です。他の関数と同様に、ラムダは引数を受け取り、何かが返されることを期待することもできます。

forEach ラムダから false を返そうとすると、実際にはこの匿名関数を終了してブール値を出力しようとしています。ただし、forEach 関数は結果を返すことは期待されていません。これは単にこの関数の実装方法ではありません。

実際、forEach 関数の実装を見ると、Consumer を受け入れることがわかります。

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}
ログイン後にコピー

コンシューマは、単一の入力引数を受け入れ、結果を返さない操作を表すインターフェイスです。この実装では、内部で forEach 関数が for each ループを使用し、指定されたアクションを実行し、何も返していないことがわかります。

したがって、関数型アプローチで操作を満たすには、別のラムダを見つける必要があります。ここには良い候補があります: allMatch.

allMatch ラムダを使用すると、バスケットのすべての要素がフルーツかどうかを確認できます。

private boolean onlyFruits(List<Food> basket) {
    return basket.stream().allMatch(food -> food.getFoodType() == FRUIT);
}
ログイン後にコピー

その場合、ラムダは true を返します。そして、allMatch の内部を見ると:

boolean allMatch(Predicate<? super T> predicate);
ログイン後にコピー

allMatch 関数が述語を期待していることがわかります。

Predicate は Consumer と同じような関数型インターフェイスですが、動作方法が少し異なります。 Consumer は 1 つの入力引数を受け入れ、結果を返さない操作を表しますが、Predicate は、オブジェクトの条件をテストし、ブール値 (true または false) を返すために使用される 1 つの引数の述語 (ブール値関数) を表します。 ).

他にも非常に重要な機能インターフェイスがあります。それらが何で、どのように機能するのか教えていただけますか?

興味を持ち続けてください!

貢献する

書くには時間と労力がかかります。 私は書いて知識を共有するのが大好きですが、支払わなければならない請求書もあります。

私の作品を気に入っていただけましたら、Buy Me a Coffee を通じて寄付することをご検討ください: https://www.buymeacoffee.com/RaphaelDeLio

またはビットコインを送ってください: 1HjG7pmghg3Z8RATH4aiUWr156BGafJ6Zw

以上がforEach ラムダでは Java の return ステートメントで関数を終了できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート