java-8 streams:来自中间操作的新流是否在不增加内存的情况下返回?

Rav*_*abu 2 java java-8 java-stream

我试图详细了解java-8流.

上的oracle文档页面:

Streams在几个方面与集合不同:

没有存储.流不是存储元素的数据结构; 相反,它通过计算操作管道传递来自诸如数据结构,数组,生成器函数或I/O通道的源的元素.

流操作和管道

流操作分为中间操作和终端操作,并组合成流管道.

流管道由源(例如集合,数组,生成器函数或I/O通道)组成; 然后是零个或多个中间操作,例如Stream.filter或Stream.map; 和一个终端操作,如Stream.forEach或Stream.reduce.

中间操作返回一个新流

除了文档,我还经历了相关的SE问题:

Java中的流如何影响内存消耗?

引用的所有地方都说由于流操作的管道衬里而没有消耗额外的内存.原始流将通过管道传递.

本杰明博客的一个工作实例:

List<String> myList =
    Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

但是当中间操作像filter, map and sorted 返回新流时,怎么会不增加内存消耗?我在这里错过了什么吗?

das*_*ght 7

我认为你在字面上解释了文档中的"无存储"部分,因为"没有内存增加".这种解释是错误的:"无存储"意味着"没有存储流元素".Stream对象本身表示固定开销,与空集合具有一些开销的方式相同,因此流本身的大小不计算在内.

但是当像filter,map和sorted这样的中间操作返回新流时,为什么它不会增加内存消耗?

确实如此.然而,尺寸的增加是固定的,即O(1)增加.这与集合形成对比,集合中制作n元素集合的副本的增加是O(n).