在下面的代码中,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/