【问题标题】:Java streams list processing order [duplicate]Java流列表处理顺序[重复]
【发布时间】:2018-05-30 12:35:34
【问题描述】:

谁能解释一下下面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

【问题讨论】:

  • 你有什么理由期望它是这样的?
  • 流是惰性的,一次一个元素是从源中提取的,你看到的是预期的。我 100% 确定这是重复的...

标签: java java-8 java-stream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Stream 管道被延迟评估。这意味着它仅在终端操作需要此类元素时才对 Stream 元素执行中间操作 - 在您的情况下为 forEach

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-20
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多