Java 16 好玩新玩法:StreamAPI toList变身,带你领略集合操作新境界

简介: Java 16 好玩新玩法:StreamAPI toList变身,带你领略集合操作新境界

我们经常使用 Stream API 最后都会进行重新组装成一个 List,例如下面的代码:

public class StreamTest {
    @Test
    void test() {
        List<String> list = List.of("ABC", "ACD", "BCD", "CCE");
        List<String> result = list.stream()
                .filter(e -> e.contains("D"))
                .collect(Collectors.toList());
        System.out.println(result);
    }
}

上面这是 Java8 的写法,在 Java 16 中可以将最后的 .collect(Collectors.toList()); 进行简化,例如:

public class StreamTest {
    @Test
    void test() {
        List<String> list = List.of("ABC", "ACD", "BCD", "CCE");
        List<String> result = list.stream()
                .filter(e -> e.contains("D"))
                .toList();
        System.out.println(result);
    }
}

这个方法是 Java 16 才支持的一个方法,它可以直接将 Stream 转化成 List

就完整上面的代码逻辑,这样的替换完全是可以的,但是虽然最终都转成 List 了,他们之间是否还有区别呢?

这里我单独拉出来说,显然肯定是有区别的。

通过查看 Stream.toList() 的源码:

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

我们可以发现,它所创建的是一个 unmodifiableList 不可变的 List。

而使用 Stream.collect(Collectors.toList()) 创建出来的则是一个普通的 List,是可以做增删改操作的。

那么如果用 Collectors 也要创建不可变的 List 要怎么写呢?其实也很简单,只需要调用 Collectors.toUnmodifiableList() 就可以了。

public class StreamTest {
    @Test
    void test() {
        List<String> list = List.of("ABC", "ACD", "BCD", "CCE");
        List<String> result = list.stream()
                .filter(e -> e.contains("D"))
                .collect(Collectors.toUnmodifiableList());
        System.out.println(result);
    }
}

但要注意的是,这个方法 Java 8 里也没有,是 Java 10 才开始支持的。

Stream.toList() 的性能要各方面都要好于Collectors.toList()Collectors.toUnmodifiableList()

相关文章
|
1月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
196 100
|
1月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
217 101
|
1月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
3月前
|
Java
Java 中 `toList()` 与 `collect(Collectors.toList())` 的微妙差异:别再乱用了!
Java 中 `toList()` 与 `collect(Collectors.toList())` 的微妙差异:别再乱用了!
285 0
|
23天前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
53 7
|
3月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
355 80
|
3月前
|
安全 Java API
Java 8 Stream API:高效集合处理的利器
Java 8 Stream API:高效集合处理的利器
243 83
|
1月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
|
2月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
192 23
|
2月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。
下一篇
开通oss服务