ホームページ >Java >&#&チュートリアル >Java 9 の「takewhile」に相当する Java 8 をストリームに実装するにはどうすればよいですか?

Java 9 の「takewhile」に相当する Java 8 をストリームに実装するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-19 21:17:10806ブラウズ

How to Implement Java 8's Equivalent of Java 9's `takeWhile` for Streams?

Java 8 ストリーム: 述語による制限

無限のストリームが存在する可能性があるシナリオでは、最初のストリームまでストリームを制限する必要がよく発生します。要素は特定の述語に失敗します。 Java 9 では便利な takewhile 操作が導入され、この機能を簡単に有効にできました。

残念ながら、Java 8 にはそのような操作がありません。したがって、この動作を実現するには別のアプローチを検討する必要があります。

Java 8 での takewhile の実装

Java 8 で takewhile を実装するには、次の戦略を活用できます。

  1. 次を使用してストリームからイテレータを作成しますiterator().
  2. 述語が失敗するまでイテレータを繰り返します。
  3. generate() を使用してフィルタリングされた要素を新しいストリームに収集します。

以下は実装例:

import java.util.Iterator;
import java.util.stream.Stream;

public class StreamTakeWhile {

    public static <T> Stream<T> takeWhile(Stream<T> stream, java.util.function.Predicate<T> predicate) {
        Iterator<T> iterator = stream.iterator();
        return Stream.generate(() -> {
            if (iterator.hasNext() && predicate.test(iterator.next())) {
                return iterator.next();
            }
            return null;
        });
    }

    public static void main(String[] args) {
        StreamTakeWhile.takeWhile(Stream.iterate(1, n -> n + 1), n -> n < 10)
                .forEach(System.out::println);
    }
}

Java 9 を使用するtakewhile

Java 9 では、以下に示すように takewhile 操作を直接利用できます。

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

以上がJava 9 の「takewhile」に相当する Java 8 をストリームに実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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