web-dev-qa-db-ja.com

takeWhileはfilterとどう違うのですか?

TakeWhile()はJava 9のfilter()とどのように異なりますか?それはどのような追加のユーティリティを持っていますか?

Stream.of(1,2,3,4,5,6,7,8,9,10).filter(i -> i < 4 )
        .forEach(System.out::println);

これはおそらく以下が行うことです

Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i < 4 )
        .forEach(System.out::println);

では、この新しい機能の必要性は何でしたか?

13
Rajeev Ranjan

filterは、条件を満たさないすべてのアイテムをストリームから削除します。

takeWhileは、条件を満たさないアイテムが最初に出現したときにストリームを中止します。

例えば.

Stream.of(1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1)
    .filter(i -> i < 4 )
    .forEach(System.out::print);

印刷します

123321

だが

Stream.of(1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1)
    .takeWhile(i -> i < 4 )
    .forEach(System.out::print);

印刷します

123

11
OldCurmudgeon

違い

takeWhile

フィルタがtrueのときに値を取り、その後停止します

フィルタ

フィルタに一致するすべての値を取ります

Stream.of(1,2,3,4,5,6,7,8,9,10).filter(i -> i % 2 == 0 )
    .forEach(System.out::println);

[〜#〜] tio [〜#〜]

これにより、2から10までのすべての偶数が出力されます。

Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i % 2 == 0 )
    .forEach(System.out::println);

[〜#〜] tio [〜#〜]

1は偶数ではないため、これは何も出力しません。したがって、何も出力する前に停止します。

2
jrtapsell

これは、最初のnull値のインデックスを取得するために使用できます。

Stream.of("Test", "Test2", null, "Test2", null).takeWhile(Objects:isNull).count();

filterでも同じことができますが、その場合、最初のnull値を取得したらすぐにフィルターを解除する条件が必要になります。したがって、実際には、filterはその種の作業には適していませんが、takeWhileはまさにその場合に適しています。

1
Murat Karagöz