stream().toList()与.collect(Collectors.toList())

STM32F407+LAN8720网口不通?别慌,手把手教你用CubeMX和LWIP搞定RMII以太网(附复位与PHY地址避坑指南) 本文详细解析了STM32F407与LAN8720通过RMII接口实现以太网通信的完整流程,重点解决了网口不通的常见问题。从硬件连接到CubeMX配置,再到LWIP网络参数设置,提供了复位时序、PHY地址配置等关键细节的避坑指南,帮助开发者快速排查和解决以太网通信故障。 阅读详情

在Java Stream中,.toList()(Java 16+引入)与.collect(Collectors.toList())(Java 8+支持)是两种将流转换为列表的常用方法,但它们在可变性、性能、版本兼容性及使用场景上存在显著差异。

1. 核心区别:可变性

  • .collect(Collectors.toList())

        返回可变List(默认实现为ArrayList),支持add()、remove()、set()等修改操作。例如:

List<String> mutableList = source.stream().collect(Collectors.toList());
mutableList.add("new"); // 成功
  • .stream().toList()

        返回不可变List(Java 16+标准实现为Collections.unmodifiableList或ImmutableCollections.ListN),禁止任何修改操作,否则抛出UnsupportedOperationException。例如:

List<String> immutableList = source.stream().toList();
immutableList.add("new"); // 抛出 UnsupportedOperationException

注意:不可变性仅针对容器本身,若列表元素为可变对象(如自定义类实例),其属性仍可修改。

2. 性能差异

  • .toList()
    在创建不可变列表时通常更高效,因直接基于流元素构建,避免了Collectors.toList()的中间转换步骤。但大规模数据场景下(如超10万条),性能可能略逊于Collectors.toList()(后者在批量处理中优化更充分)。

  • .collect(Collectors.toList())
    在需要频繁修改列表或处理大规模数据时表现更优,因ArrayList的动态扩容机制适配增删需求。

3. 版本兼容性

  • .collect(Collectors.toList()):兼容Java 8及以上所有版本,是Java 8-15的唯一选择。
  • .stream().toList():仅限Java 16+使用,属于预览特性(需启用预览功能编译),但正式版本已稳定支持。

4. 其他关键差异

  • 空元素处理
    Collectors.toList()允许null元素;toList()在部分实现中可能抛NullPointerException(需测试具体版本行为)。

  • 序列化场景
    在Spring Cache+Redis场景中,collect(Collectors.toList())因添加类型标识符(如"java.util.ArrayList")更利于序列化/反序列化;toList()可能因缺少类型信息导致反序列化失败。

  • 代码简洁性
    .toList()无需导入Collectors类,代码更简洁(如stream().toList() vs stream().collect(Collectors.toList()))。

5. 使用建议

  • 优先.stream().toList()的场景:
    • Java 16+环境,且列表无需修改(如只读查询结果、配置数据)。
    • 追求代码简洁与不可变性安全(防止意外修改)。
    • 多线程环境(不可变列表天然线程安全)。
  • 优先.collect(Collectors.toList())的场景:
    • 需兼容Java 8-15版本。
    • 列表需后续修改(如添加临时数据)。
    • 处理含null元素或大规模数据。
    • 序列化/反序列化敏感场景(如Redis缓存)。

示例对比

// Java 16+ 不可变列表
List<String> immutableList = source.stream().toList();
// 尝试修改 → 抛异常

// Java 8+ 可变列表
List<String> mutableList = source.stream().collect(Collectors.toList());
mutableList.add("new"); // 成功

总结:选择时需权衡版本兼容性、可变性需求、性能及代码风格。若需不可变性、高性能或代码简洁,优先选择.stream().toList();若需可变性、兼容旧版本或处理特殊场景(如序列化、空元素),选择.collect(Collectors.toList())。根据具体业务需求权衡版本兼容性、可变性需求及性能要求。

从零开始:用AutoLisp为AutoCAD定制专属工具栏(2023最新版) 本文详细介绍了如何利用AutoLisp语言为AutoCAD定制专属工具栏,以提升绘图效率。内容涵盖从环境配置、AutoLisp基础语法到实战开发的全过程,指导用户编写自动化脚本、封装功能函数,并最终通过CUI编辑器创建和部署个性化工具栏按钮,是2023年CAD用户实现工作流自动化与个性化的实用指南。 阅读详情

相关推荐

RT-Thread Studio与CubeMX联合编程(超级详细)

RT-Thread Studio与CubeMX联合编程 本文章参考以下文章: https://blog.csdn.net/qq_40824852/article/details/122596043 https://zhuanlan.zhihu.com/p/395106066 https://blog.csdn.net/m0_37697335/article/details/108890584 一、简介 经过上次对RT-Thread Studio的初步尝试,发现RT-Thread Studio中存在官方支

zhuzhu的博客 3万+

Stream流中collect方法

Stream流中collect方法

李长渊的博客 2万+

DIY玩家必备:用SSS1623芯片打造高性价比USB麦克风(附完整电路图)

本文详细介绍了如何利用SSS1623芯片DIY高性价比USB麦克风,包括元件选型、电路设计、PCB布局及调试技巧。通过完整的电路参考设计和实用建议,帮助电子爱好者打造专业级录音设备,实现免驱动即插即用功能。

weixin_29166013的博客 239

如何使用collect.stream().collect()

如何使用collect.stream().collect()

NSX-Truth 1107

搭建Dzzoffice 教程

通过以上步骤,您已经成功配置了WEB环境,安装了DzzOffice,并完成了系统设置和应用安装。1.安装包的设置默认是系统盘之外的第二个盘,没有其他盘符的时候则安装在C盘,当主机盘符只有C盘可用的时候,安装时不要使用U盘,否则可能误装到U盘当中。4.如果之前已经安装,再次安装时请确保上次安装已经卸载或者所有文件可读,否则请备份文件,卸载之后再安装。在其他安装环境中,我没有相关的使用经验。3. 保证安装路径是纯净的,安装路径下不能有已安装的V8版本,若重新安装,请选择其它路径。

小胡的博客 4951

汽车电子电气架构诊断功能开发全流程解析

文章作者是一位在魔都工作的汽车电子工程师,坚持长期主义,并分享了一段关于“钝感力”的文字,强调面对困境的韧劲和耐力,以及不被外界噪音干扰的重要性。文章详细介绍了汽车电子电气架构(EEA)的诊断功能开发流程,涵盖设计、实现、生产、运维及售后五大环节。作者从技术实现维度展开,详细描述了诊断系统架构设计、供应商功能实现、产线集成与标定、云端数据交互以及售后诊断应用场景。文章还总结了技术演进趋势,包括AI融合、OTA 2.0和区块链应用等,强调了标准化协议与工具链在全链路诊断能力中的重要性。最后,作者鼓励读者相信时

Soly_kun的博客 1220

Java函数式编程Stream.collect()方法使用小结

steam():把一个源数据,可以是集合,数组,I/O channel, 产生器generator 等,转化成流。 Collectors(): 类实现了很多归约操作,例如将流转换成集合和聚合元素。通过stream().collect()方法可简单获得我们所需要的数据结构。 先创建一个prodList的集合数据 @Data public class Product { private Long id; private Integer num; private BigDecimal pr

weixin_44729970的博客 2万+

用SPSS做信效度分析

对问卷进行Cronbach’s Alpha信度检验。如果此值高于0.8,则说明信度高;如果此值介于0.7-0.8之间,则说明信度较好;如果此值介于0.6~0.7,则说明信度可接受;如果此值小于0.6,说明信度不佳。下面利用SPSS进行分析,点击分析–标度–可靠性分析选项,选中所要分析的问卷数据或题目。得到结果,我们要看这个有用的结果,当克隆巴赫Alpha系数(也可以看标准化后的)大于0.8时候,说明问卷信度较高。

小高~的博客 1万+

JDK8辅助学习(四):Stream流 collect() 方法的详细使用介绍

Stream流 collect() 方法的使用介绍 //1. <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner); //2....

扛麻袋的少年的博客 5万+

DDR4技术原理详解

DDR4是DDR4-SDRAM的简写,即第4代DDR-SDRAM,DDR-SDRAM全称Double Date Rate Synchronous Dynamic Random Access Memory。本文重点解析DDR4技术规范及其背后的电子电路原理,以及编程使用DDR4过程中需要注意的性能事项。

ctbinzi的专栏 1万+

ZED双目相机环境配置

ZED SDK 安装文件夹中有一个 Python 脚本(get_python_api.py),可以自动检测操作系统、CUDA 和 Python 版本并下载相应的预编译 Python API 包(pyzed)。安装SDK成功后,我们进入ZED SDK文件夹中的tools子文件夹,运行ZED Explorer.exe 以及 ZED Depth Viewer.exe,查看ZED相机是否能正常启用工作。在本例中,我们简单地检索ZED相机的序列号:打开 ZED相机,然后打印其序列号,然后关闭相机。

qq_53545309的博客 2139

Java8 Stream流中的 collect() 方法,远比你想象中的强大

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!每天14:00更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析...

weixin_44421461的博客 8334

【ComfyUI】FluxKontext 身形调优与体态增强

AI身形调优与体态增强解决方案 该工作流通过Flux系列模型实现人物体态的智能化增强,主要特点包括: 采用UNet主体模型+双文本编码器+身形增强LoRA的架构组合 通过ReferenceLatent保持原始姿态的同时强化胸腰臀比例 完整工作流包含图像加载、文本编码、潜空间映射等8个核心节点 支持自动化的前后效果对比展示 应用优势: 保持人物自然姿态的前提下实现局部强化 支持通过Prompt精确控制增强方向 适用于摄影后期、角色美化等创作场景 输出效果稳定且风格统一 使用方

Mr数据杨 1299

Java 16(JDK 16) Stream.toList() 和 Stream.collect(Collectors.toList())的区别及示例代码

本文主要介绍Java 16(JDK 16)中,使用Stream.toList() 和 Stream.collect(Collectors.toList())的区别及示例代码。 原文地址:Java 16(JDK 16) Stream.toList() 和 Stream.collect(Collectors.toList())的区别及示例代码

亮亮的专栏 1474

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java Stream中toList()与collect(Collectors.toList())的差异解析

在Java集合处理中,Stream API的toList()与collect(Collectors.toList())是两种常见的集合转换方式,但它们在实现原理和应用场景上存在显著差异。toList()自Java 16引入,返回不可变集合,具有更好的性能表现;而collect(Collectors.toList())则始终返回可变的ArrayList。理解这两种方法的区别对于编写高效、健壮的Java代码至关重要。在实际开发中,根据是否需要集合可变性来选择合适的方法,可以避免常见的UnsupportedOpe

weixin_32306957的博客 196

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java.lang.UnsupportedOperationException: null报错之collect(Collectors.toList())和toList()的区别

是 Java 8 引入的,用于通过流 API 收集元素到列表中。是 Java 16 引入的预览特性,允许你更简洁地将流转换为列表。但请注意,这是预览特性,可能会在未来的版本中发生变化或移除。在使用这些特性时,请确保你的代码与你的目标 Java 版本兼容,并考虑到可能的变化。对于需要向后兼容的代码库,通常建议使用。

qq_65871614的博客 985

Stream流的toList方法踩坑

1

nullPoninter的博客 433

千万不要滥用Stream.toList(),有坑!

应将相等的实例视为可互换的,不应将它们用于同步,否则可能会发生不可预知的行为。工厂可以自由地创建新的实例或重用现有的实例。of和List.copyOf静态工厂方法为创建不可修改的列表提供了一种方便的方法。从Java16开始,Stream有了直接toList方法, java8时候常用的方法是。列表中元素的顺序与提供的参数或提供的数组中元素的顺序相同。但是,如果包含的元素本身是可变的,这可能会导致List的内容看起来发生变化。如果所有元素都是可序列化的,那么它们就是可序列化的。该接口是Java集合框架的成员。

mf97532的博客 446

【Java】Stream toList()和 collect(Collectors.toList())的区别、toList 有坑

Stream toList()返回的是只读List原则上不可修改,collect(Collectors.toList())默认返回的是ArrayList,可以增删改查在公司看到开发环境突然发现了UnsupportedOperationException 报错,想到了不是自己throw的应该就是操作collection不当。发现的确是同事使用了类似作为返回, 后继续使用了返回值做add操作,导致报错Stream toList()和 collect(Collectors.toList())的区别。

九师兄 77

JDK 10-11重大突破:Stream API革新,toList()和不可变集合性能飞跃!

而 JDK 10 和 11 作为 JDK 9 后的迭代版本,对 Stream 并未做大规模重构,而是聚焦 “细节优化”: 这些看似 “小步” 的改进,却能大幅降低日常开发中的代码冗余,尤其是 JDK 11 的 toList() ,成为继 JDK 9 ofNullable() 之后又一个 “提效神器”。 本文会逐一拆解这些优化点,通过 “JDK 8/9 vs JDK 10/11” 的代码对比,让你理解这些细节改进的实际价值。

y245166349的专栏 564

java基础总结(七十二)--java8中parallel使用注意事项

package test; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class noname { public static void main(String[] args) { List<Integer> l...

秋天的猿 2106

Java8逗号分隔字符串转列表及列表转逗号分隔字符串操作

算是工作中比较常用的操作,记录一下 逗号分隔字符串转列表 通过 String 的 split() 将字符串分割成数组,然后通过 Stream.of() 将数组转为 Java8 的 stream 流然后进行正常的流操作再通过 collect(Collectors.toList()) 转为 List 列表转逗号分隔字符串 这个操作只需要在 collect() 方法中使用 Collectors.joining(",") 即可 ...

AhogeK的博客 2417

java工具:《Java 8 Stream实战:字符串数组转List<Integer>》

本文演示了使用Java 8 Stream API将逗号分隔的字符串转换为Integer集合的简洁方法。通过split()分割字符串后,利用Stream.of()创建流,map()方法进行类型转换,最后collect()收集为List集合。该方法仅用3行代码就完成了传统循环方式需要多行代码才能实现的功能,展现了函数式编程的优雅与高效。

刘大猫 156

【并发编程】CompletableFuture.supplyAsync 二次封装

【代码封装】CompletableFuture.supplyAsync二次封装

SurfingMaster 425

java8 stream().map().collect()的Collectors.toList()、Collectors.toMap()、Collectors.groupingBy()的用法

  现在有个集合: List<User> users = getUserList();   现在需要将这些user的id提取出来。这个很简单,for循环嘛,谁不会啊(不会吧不会吧,不会有人还不会用for循环的吧)。 List<Long> idList = new ArrayList<Long>(); for(int i = 0; i < users.size(); i++){   idList.add(users.get(i).getId()); }   

琪丶琪的博客 2万+

Stream toList不能滥用以及与collect(Collectors.toList())的区别

Stream toList()返回的是只读List原则上不可修改,collect(Collectors.toList())默认返回的是ArrayList,可以增删改查

玩大神的优快云的博客 4445
上一篇: 记录一次由yum update引起的http服务ERR_CONTENT_LENGTH_MISMATCH问题
下一篇: 谷歌开源翻译模型 TranslateGemma 深度解析与本地部署实践
Jack_abu
博客等级 码龄10年 633粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_abu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值