Java17的stream流里toList和.collect(Collectors.toList())有什么不同

源码分析:

复制代码
.collect(Collectors.toList());
    public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>(ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }

在源码里能看到,使用.collect(Collectors.toList());收集出来的list实际类是ArrayList

.tolist

    default List<T> toList() {
        return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())));
    }

    @SuppressWarnings("unchecked")
    public static <T> List<T> unmodifiableList(List<? extends T> list) {
        if (list.getClass() == UnmodifiableList.class || list.getClass() == UnmodifiableRandomAccessList.class) {
           return (List<T>) list;
        }

        return (list instanceof RandomAccess ?
                new UnmodifiableRandomAccessList<>(list) :
                new UnmodifiableList<>(list));
    }

但是tolist收集出来的list实际类是UnmodifiableList这个类

UnmodifiableList 介绍

UnmodifiableList 是 Java 中的一个类,用于创建不可修改的列表。它实际上是通过 Collections.unmodifiableList() 方法创建的。一旦列表被创建为不可修改的,就无法对其进行添加、删除或修改元素的操作。这种列表对于保护数据不被意外修改或者共享数据而不希望被修改很有用。当你想要确保某个列表在传递给其他代码时不会被修改时,可以使用 UnmodifiableList 来包装你的列表。

结论:如果你想在stream后对list进行修改操作,那么就用.collect(Collectors.toList());,如果不想结果被修改操作,那么就直接使用.toList();

相关推荐
风_流沙3 分钟前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
charlie1145141917 分钟前
C++ STL CookBook
开发语言·c++·stl·c++20
袁袁袁袁满7 分钟前
100天精通Python(爬虫篇)——第113天:‌爬虫基础模块之urllib详细教程大全
开发语言·爬虫·python·网络爬虫·爬虫实战·urllib·urllib模块教程
ELI_He99913 分钟前
PHP中替换某个包或某个类
开发语言·php
m0_7482361121 分钟前
Calcite Web 项目常见问题解决方案
开发语言·前端·rust
倔强的石头10629 分钟前
【C++指南】类和对象(九):内部类
开发语言·c++
ProtonBase32 分钟前
如何从 0 到 1 ,打造全新一代分布式数据架构
java·网络·数据库·数据仓库·分布式·云原生·架构
Watermelo61733 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v39 分钟前
leetCode43.字符串相乘
java·数据结构·算法
半盏茶香2 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法