java - 为什么java streams跳过方法强制执行其他操作

标签 java java-8 java-stream

在下面的代码中,secnario-1,map 方法从未执行以生成我的列表的计数。我知道这是延迟加载。 但是在第二种情况下,为什么执行 map 方法只是为了获取我的列表的计数? JVM 只需要跳过 3 个元素就可以在不执行 map 方法的情况下带来计数。

public static void main(String[] args) {
        List<String> list = Arrays.asList("abc1", "abc2", "abc3", "xyz", "xyz2");
        // scenario-1
        long count1 = list.stream().map(a -> {
            System.out.print("Map-");
            return a.substring(0, 2);
        }).count();
        System.out.println(count1);

         // scenario-2
        long count2 = list.stream().skip(3).map(a -> {
            System.out.print("Map-");
            return a.substring(0, 2);
        }).count();
        System.out.println(count2);
    }
}

最佳答案

I understand this is lazy loading

你没有理解正确。不是“懒加载”,而是短路操作。执行 map 不会改变底层拆分器仍然 SIZED 的事实,即使在 map 之后也是如此:

boolean isSized =
   list.stream().map(x->x).spliterator().hasCharacteristics(Spliterator.SIZED);
System.out.println(isSized); // true

与添加 skip 时不同:

boolean isSized =
   list.stream().skip(3).map(x->x).spliterator().hasCharacteristics(Spliterator.SIZED);
System.out.println(isSized); // false

关于java - 为什么java streams跳过方法强制执行其他操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68171794/

相关文章:

java - 停止引用的服务后终止 OSGI 蓝图包

java - 使用 JAXB 但未获取值

java - Micronaut:从上下文获取 bean 的问题

java - 使用流收集时 jdk8 与 jdk11 的不同行为

java - 在 Java 8 中,如何同时遍历两个数组?

java - opencv中哪个函数可以检测并去除物体的阴影?

android - 使用 lambda 表达式创建一个 AlertDialog

Java 8 流分组依据

java - 我是否必须在流读取的列表上进行同步?

java - 如何使用java 8集合并行流处理设置负载平衡?