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);
那么这个新功能需要什么?
答案 0 :(得分:13)
filter
将从流中删除不满足条件的所有项目。
takeWhile
将在第一次出现不符合条件的项目时中止流。
e.g。
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
答案 1 :(得分:3)
过滤器为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不是偶数,所以在输出任何内容之前它会停止。
答案 2 :(得分:2)
根据这篇博文:https://blog.codefx.org/java/java-9-stream/
在有序流上调用它将返回一个新元素,该元素由传递谓词的元素组成,直到第一个失败。它有点像过滤器,但是当第一个元素失败谓词时,它会切断流。用它来说,它从流中获取元素,而谓词一旦不再存在就停止并停止。
我用粗体标记了重要的东西。
帖子中的例子:
Stream.of("a", "b", "c", "", "e")
.takeWhile(s -> !String.isEmpty(s));
.forEach(System.out::print);
输出abc
。因为它会过滤直到第一个与谓词不匹配(在示例中为第4个元素)。所以你可以说它将流短路。
答案 3 :(得分:1)
它可用于获取第一个null
值的索引,例如
Stream.of("Test", "Test2", null, "Test2", null).takeWhile(Objects:isNull).count();
您可以对filter
执行相同操作,但在这种情况下,您需要有条件在获得第一个空值后立即中断过滤器。因此,在实践中,filter
不适用于此类工作,而takeWhile
正是针对该情况。
答案 4 :(得分:-1)
takeWhile 和 dropWhile 操作比过滤器更有效。这些操作利用了短路,这意味着:结果发现计算停止,因此无需使用过滤器操作处理整个流