当前位置: 首页 > article >正文

【java17】java17新特性之Stream.toList()

在Java17之前如果需要将Stream流中的元素转换成List,需要通过调用Collectors方法使用Collectors.toList(),代码非常冗长。

在Java17之前使用如下:

List<Integer> integerList = Stream.of(1, 2, 3, 4, 5).collect(Collectors.toList());

Stream.toList()的使用

在Java 17中将会变得简单,可以直接调用Stream.toList()。

List<Integer> integerList1 = Stream.of(1, 2, 3, 4, 5).toList();

Stream.toList()与Collectors.toList()的区别

先来看下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);
}

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

再来看下Stream.toList()的源码:

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

java.util.Collections#unmodifiableList

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));
}

但是Stream.toList()收集出来的list实际类是UnmodifiableList这个类。

UnmodifiableList介绍

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

从UnmodifiableList的源码可以看出,对UnmodifiableList中元素的增删改操作都会抛出UnsupportedOperationException异常。

public E set(int index, E element) {
    throw new UnsupportedOperationException();
}

public void add(int index, E element) {
    throw new UnsupportedOperationException();
}

public E remove(int index) {
    throw new UnsupportedOperationException();
}

public boolean addAll(int index, Collection<? extends E> c) {
    throw new UnsupportedOperationException();
}

@Override
public void replaceAll(UnaryOperator<E> operator) {
    throw new UnsupportedOperationException();
}
@Override
public void sort(Comparator<? super E> c) {
    throw new UnsupportedOperationException();
}

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


http://www.kler.cn/a/322289.html

相关文章:

  • 《编程与艺术的交汇:Python Turtle 绘画与游戏制作》
  • 植物明星大乱斗15
  • [ 网络安全介绍 1 ] 什么是网络安全?
  • 关于安卓模拟器或手机设置了BurpSuite代理和安装证书后仍然抓取不到APP数据包的解决办法
  • Chrome 浏览器 131 版本新特性
  • 5.STM32之通信接口《精讲》之USART通信---实验串口接收程序
  • 3271.哈希分割子串
  • 前端使用vue点击上传文件,传送给后端,后端进行文件接收
  • 区块链—共享块存储安全可信任可追踪分布式数据库系统技术
  • LTE SSS产生过程中z序列的介绍和MATLAB以及C语言实现
  • 7个不为人知的实用软件推荐
  • 关于VSCode里需要用的一些插件总结
  • 19 基于51单片机的倒计时音乐播放系统设计
  • USB 3.1 标准 A 型到 USB 3.1 标准 A 型或 B 型的电缆组件
  • Spring MVC 基础 : 文件、cookies的接收 ,REST响应
  • python命令行怎么换行
  • Python批量处理客户明细表格数据,挖掘更大价值
  • 电脑退域或切换系统账号后系统黑屏
  • C#基于SkiaSharp实现印章管理(8)
  • 这五本大模型书籍,让你从大模型零基础到精通,非常详细收藏我这一篇就够了
  • 【PyTorch】环境配置
  • MySQL 数据转换技巧:列转行与行转列
  • Redis支持数据类型,它们各自的应用场景是
  • 基于以太坊+IPFS的数据交易平台进行效率评估
  • MapReduce学习与理解
  • 14年408-计算机网络