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 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
researcher-Jiang4 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
西门吹-禅5 小时前
java springboot N+1问题
java·开发语言·spring boot
DLYSB_5 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
skywalk81635 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
weixin_BYSJ19876 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
AI小码6 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
Hui Baby6 小时前
Spring Security
java·后端·spring
IT笔记7 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
2zcode7 小时前
免费开源项目文档:基于MATLAB卷积神经网络的口罩佩戴检测系统
开发语言·matlab·cnn