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);
では、この新しい機能の必要性は何でしたか?
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
フィルタがtrueのときに値を取り、その後停止します
フィルタに一致するすべての値を取ります
Stream.of(1,2,3,4,5,6,7,8,9,10).filter(i -> i % 2 == 0 )
.forEach(System.out::println);
これにより、2から10までのすべての偶数が出力されます。
Stream.of(1,2,3,4,5,6,7,8,9,10).takeWhile(i -> i % 2 == 0 )
.forEach(System.out::println);
1は偶数ではないため、これは何も出力しません。したがって、何も出力する前に停止します。
これは、最初のnull
値のインデックスを取得するために使用できます。
Stream.of("Test", "Test2", null, "Test2", null).takeWhile(Objects:isNull).count();
filter
でも同じことができますが、その場合、最初のnull値を取得したらすぐにフィルターを解除する条件が必要になります。したがって、実際には、filter
はその種の作業には適していませんが、takeWhile
はまさにその場合に適しています。