【发布时间】:2018-10-25 09:40:28
【问题描述】:
我在学习 Stream.limit() 说:
返回由该流的元素组成的流,截断长度不超过 maxSize。
这可以理解为:
Stream.of(1,2,3,4,5,6,7,8)
.limit(3)
.forEach(i -> {
System.out.print(i + ",");
}); //prints: 1,2,3,
但是当与其他流方法一起使用时,它具有批量处理元素的效果:
Stream.of(1,2,3,4,5,6,7)
.filter(i -> {
System.out.println("Filtering " + i + ": " + (i%2 == 0));
return i%2 == 0;
})
.map(i-> {
System.out.println("Mapping " + i + " to " + i*i);
return i*i;
})
.limit(2)
.forEach(i -> System.out.println("---> " + i));
打印:
Filtering 1: false
Filtering 2: true
Mapping 2 to 4
---> 4
Filtering 3: false
Filtering 4: true
Mapping 4 to 16
---> 16
在这里,您可以看到元素以 2 个为单位进行处理。
我有以下疑问:
-
为什么它不只处理前两个元素 1 和 2?也就是为什么输出不只是:
Filtering 1: false Filtering 2: true Mapping 2 to 4 ---> 4 -
为什么它没有处理最后四个元素 5、6、7 和 8 并打印以下内容?:
Filtering 5: false Filtering 6: true Mapping 6 to 36 ---> 36 Filtering 7: false Filtering 8: true Mapping 8 to 64 ---> 64
【问题讨论】:
-
它们不是以两个为一组进行处理的。它们被逐个处理,但由于第一个和第三个被过滤器拒绝,它们没有被映射,即它们没有传递给管道的下一个操作,即映射函数。
-
这取决于你的限价指令放置在哪里。
-
@eric.v 喜欢吗?还有其他例子吗?
-
我推荐阅读this answer,然后想象你在管道中插入一个“让最多n个元素”阶段,一次在开始,一次在结束......
标签: java functional-programming java-stream