List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
List<Integer> twoEvenSquares = numbers.stream().filter(n -> {
System.out.println("filtering " + n);
return n % 2 == 0;
}).map(n -> {
System.out.println("mapping " + n);
return n * n;
}).limit(2).collect(Collectors.toList());
for(Integer i : twoEvenSquares)
{
System.out.println(i);
}
filtering 1
filtering 2
mapping 2
filtering 3
filtering 4
mapping 4
4
16
filtering 1
filtering 2
filtering 3
filtering 4
mapping 2
mapping 4
4
16
因为在过滤2之后,我们还得再找到一个元素来分层极限(2),操作,那么为什么输出不像我解释的那样呢?
流是基于拉的。只有终端操作(如collect
)才会导致项目被消耗。
概念上,这意味着collect
将从limit
、map
、map
、filter
和filter
从流中询问项。
您的问题中的代码示意性地导致
collect
limit (0)
map
filter
stream (returns 1)
/filter (false)
filter
stream (returns 2)
/filter (true)
/map (returns 4)
/limit (1)
limit (1)
map
filter
stream (returns 3)
/filter (false)
filter
stream (returns 4)
/filter (true)
/map (returns 16)
/limit (2)
limit (2)
/limit (no more items; limit reached)
/collect
例如,您有一个要转换为JSONObject的pojo列表。你有一个POJO的列表。但是为了转换为JSONObject,您需要使用JSONObject put方法。 如果我只想做一个手术,我就可以做
是否有任何保证在顺序和有序流上的操作是按遇到顺序处理的? 我是说,如果我有这样的代码: 是否可以保证它将按照生成范围的遇到顺序执行myFunction()调用? 我找到了Stream类的JavaDocs草案,它明确地说明了以下内容: 对于顺序流管道,如果管道源具有已定义的遇到顺序,则所有操作都按照管道源的遇到顺序执行。 但是它没有提到顺序流,这个例子是针对并行流的(我的理解是,顺序流和并行流都是正
我有一个java。util。流动包含键值对的流,如: 现在,我想合并所有具有相同密钥的条目: 数据已经排序,因此只需合并连续的数据集。 现在,我正在寻找一种方法来转换上述流的内容,而不将所有数据集加载到内存中。 我更喜欢得到一个java.util.stream.Stream,结果是一个不同的对象类型包含一个值列表,而不是一个单独的值。 我唯一的方法是一个自定义迭代器,它执行合并,但是转换为迭代器并
问题内容: 在Java8中运行以下流示例: 产量: 当然-这并不奇怪。由于http://docs.oracle.com/javase/8/docs/api/index.html?overview- summary.html ,流是顺序执行还是并行执行都没有关系: 除了标识为明确不确定的操作(例如findAny())之外,流是顺序执行还是并行执行都不应该更改计算结果。 AFAIK 是确定性的并且是关
在我的一些项目中,我经常使用do-thin-check NextForNull-getNext循环模式(不知道它是否有官方名称)。但是在Java8中,与检查客户端代码中的空引用相比,使用可选被认为是更干净的代码。但是当在这种循环模式中使用可选时,代码会变得有点冗长和丑陋,但是因为可选有一些方便的方法,我希望一定存在比我下面提出的更干净的方法。 示例: 考虑到下面的课程。 其中第一个项目的nr==1
我在火花流应用程序中从kafka读取数据并执行两个操作 将dstream插入hbase表A 更新另一个hbase表B 我想确保对于dstream中的每个rdd,插入hbase表A将在对hbase表B进行更新操作之前发生(每个rdd依次发生上述两个动作) 如何在火花流应用中实现这一点