Java流列表处理顺序

时间:2018-05-30 12:35:34

标签: java java-8 java-stream

有人可以解释下面java流代码的输出:

List<Integer> l = new ArrayList<>();
l.add(0);
l.add(1);
l.add(2);
l.add(3);
l.add(4);
l.add(4);
l.stream()
    .distinct()
    .map(v -> {
        System.out.println("In Map " + v);
        return v;
    }).forEach(v -> {
        System.out.println("In ForEach " + v);
    });

我期待:

In Map 0 
    In Map 1 
    In Map 2 
    In Map 3 
    In Map 4 
    In ForEach 0 
    In ForEach 1 
    In ForEach 2 
    In ForEach 3 
    In ForEach 4

但它打印出来:

In Map 0 
    In ForEach 0 
    In Map 1 
    In ForEach 1 
    In Map 2 
    In ForEach 2 
    In Map 3 
    In ForEach 3 
    In Map 4 
    In ForEach 4

2 个答案:

答案 0 :(得分:0)

我认为这很明显:)它在Map中,每个值都在foreach调用。这就像嵌套循环。获得价值1 - 处理它,获得价值2处理它;)这就是你得到的

答案 1 :(得分:0)

const myStr: ActionTypes = "something" // no error const myStr2: ActionTypes = "ACTION_ONE" // error 管道被懒惰地评估。这意味着它仅在终端操作需要这些元素时才对Stream元素执行中间操作 - 在您的情况下为Stream

如果终端操作只需要一个元素(例如forEach),则findFirst()操作仅对map()的第一个元素执行。