Java中流收集器方法

本文探讨了 Collector 方法的演变,重点关注从传统方法到最新便捷方法的转变。通过了解这些变化,开发人员可以编写更可读、更高效、更简洁的代码。

使用旧的收集器方法:Collectors.toList()
在 Java 的早期版本中,Collectors实用程序类是将流中的元素收集到容器(例如List、Set或Map )中的首选解决方案。典型的模式涉及将stream()操作与各种中间操作链接起来,最终以collect()终端操作结束。例如,要从一个列表中过滤并收集大于 2 的数字到另一个列表中,您可以使用:

List<Integer> numbers = List.of(1, 2, 3, 4, 5);
List<Integer> collectedNumbers = numbers.stream()
        .filter(i -> i > 2).collect(Collectors.toList());

这种方法虽然强大且灵活,但通常需要更详细的代码来执行本质上常见的操作。开发人员需要显式使用Collectors类方法,向其代码库添加更多样板。

使用新的收集器便捷方法:toList()和toArray()
自 JDK 16 以来,Java 通过引入toList()和toArray()等便捷方法来增强其 Stream API ,直接集成到 Stream 接口中。这些新增内容旨在显着提高代码可读性并减少冗长。这些方法专门针对将流元素收集到列表或数组的频繁用例而定制,消除了对外部实用方法的需要。JDK 16 中的这一开发代表了 Java 致力于随着现代编程的需求而发展、简化常见任务并提供更直观的编码体验。

例如:

List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// As List
List<Integer> collectedNumbers = numbers.stream()
        .filter(i -> i > 2).toList();

// As Array
Integer[] collectedNumbersArr = numbers.stream()
        .filter(i -> i > 3).toArray(Integer[]::new);


这些方法封装了收集元素的常见模式,使代码更加直观和简洁。toList ()方法将元素收集到不可修改的列表中,而toArray()允许轻松地将流元素转换为数组。这种转变不仅增强了代码的可读性,还鼓励开发人员采用 Java 流的更实用的编码风格。

总之
Java 16 中引入的 toList() 和 toArray() 这两个新的收集器便捷方法都返回不可变集合或数组。这意味着它们返回的对象在创建后不能被修改。这是因为这两个方法分别返回 List.of() 和 Arrays.copyOf() 创建的不可变对象。

这种不可变性有助于确保在并发环境中的线程安全性,并且在一些情况下可以提供更好的性能。当你希望创建一个不可变的集合或数组时,可以方便地使用 toList() 或 toArray()。

需要注意的是,这些方法返回的不可变对象对于元素本身是否可变并没有影响。如果元素是可变的,仍然可以通过它们的引用进行修改。不可变性主要体现在对集合或数组结构的操作上。