ホームページ >Java >&#&チュートリアル >述語が失敗するまで Java 8 ストリームを制限するにはどうすればよいですか?

述語が失敗するまで Java 8 ストリームを制限するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-20 17:59:10519ブラウズ

How to Limit a Java 8 Stream Until a Predicate Fails?

Java 8 での述語に基づくストリームの制限

Java 8 ストリーム操作は、データを操作およびフィルターする強力な方法を提供します。ただし、最初の要素が指定された述語に失敗するまで潜在的に無限のストリームを制限するための特定の操作がありません。

Java 9 では、takewhile 操作を使用してこの動作を実現できます。たとえば、takewhile を使用して 10 未満の数値をすべて出力するには、次のように記述できます。

IntStream
    .iterate(1, n -> n + 1)
    .takeWhile(n -> n < 10)
    .forEach(System.out::println);

しかし、takewhile が利用できない Java 8 ではどうなるでしょうか?この場合、同様の機能を実装するにはいくつかの方法があります。

1 つの方法には、filter 操作と findFirst 操作の使用が含まれます。次のコード スニペットは、どのように機能するかを示しています。

IntStream
    .iterate(1, n -> n + 1)
    .filter(n -> n < 10)
    .findFirst()
    .ifPresent(System.out::println);

このソリューションは、述語を満たさない要素 (この場合は 10 以上の数値) をフィルターで除外し、最初に残っている要素を検索します。ストリーム。一致する要素が見つからない場合、findFirst は空のオプションを返しますが、この場合は無視されます。

別の方法では、述語を引数として受け取るカスタム Stream.limitUntil メソッドを使用します。実装例を次に示します:

public static <T> Stream<T> limitUntil(Stream<T> stream, Predicate<? super T> predicate) {
    AtomicBoolean stop = new AtomicBoolean(false);
    return stream.takeWhile(t -> {
        boolean stopFlag = stop.get();
        if (!stopFlag) stopFlag = predicate.test(t);
        stop.set(stopFlag);
        return !stopFlag;
    });
}

このメソッドは次のように使用できます:

IntStream
    .iterate(1, n -> n + 1)
    .limitUntil(n -> n >= 10)
    .forEach(System.out::println);

以上が述語が失敗するまで Java 8 ストリームを制限するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。