Java 11对集合类做了哪些增强?
文章目录
- 1. `Collection` 接口新增 `toArray(IntFunction)` 方法
- 2. `Stream` 流新增 `toList()` 方法
- 3. `Optional` 类新增 `isEmpty()` 方法
- 4. 其他集合相关的间接增强
- 总结
Java 11 对集合类(Collection Framework)的增强主要集中在简化代码、提升易用性方面,虽然没有引入全新的数据结构,但对现有集合接口和工具类增加了实用方法,让集合操作更加简洁。以下是具体增强点:
1. Collection
接口新增 toArray(IntFunction)
方法
Java 11 为 Collection
接口添加了一个默认方法,用于更灵活地将集合转换为数组:
// Java 8 及之前的写法
List<String> list = Arrays.asList("a", "b", "c");
String[] array = list.toArray(new String[0]); // 需要手动创建数组实例// Java 11 新增写法(更简洁)
String[] array = list.toArray(String[]::new); // 直接传递数组构造器,无需指定长度
该方法通过 IntFunction
接口接收数组构造器(如 String[]::new
),内部会根据集合大小自动创建合适长度的数组,避免了手动指定初始长度的麻烦。
2. Stream
流新增 toList()
方法
Java 11 为 Stream
接口添加了 toList()
方法,用于快速将流结果收集为不可变列表(List
):
// Java 8 写法(需依赖 Collectors)
List<String> result = list.stream().filter(s -> s.length() > 2).collect(Collectors.toList()); // 可能返回 mutable 或 immutable 列表(取决于实现)// Java 11 新增写法(更简洁,且返回不可变列表)
List<String> result = list.stream().filter(s -> s.length() > 2).toList(); // 直接返回不可变 List,不支持 add/remove 操作
注意:toList()
返回的是不可变列表(类似 List.of()
创建的列表),如果尝试修改会抛出 UnsupportedOperationException
;而 Collectors.toList()
返回的列表是否可变则取决于具体实现(如 Java 8 中 ArrayList
是可变的)。
3. Optional
类新增 isEmpty()
方法
虽然 Optional
不属于集合类,但常与集合操作配合使用。Java 11 为 Optional
新增了 isEmpty()
方法,用于判断是否为空,替代了之前的 !isPresent()
写法,更直观:
Optional<String> opt = Optional.empty();// Java 8 写法
if (!opt.isPresent()) {System.out.println("为空");
}// Java 11 写法
if (opt.isEmpty()) { // 更简洁,语义更明确System.out.println("为空");
}
4. 其他集合相关的间接增强
-
String
类新增方法对集合的支持:Java 11 为String
新增的lines()
方法返回Stream<String>
,可直接与流操作结合处理多行文本:String text = "a\nb\nc"; List<String> lines = text.lines().toList(); // 直接转换为列表 ["a", "b", "c"]
-
集合与模块化的兼容性优化:Java 11 进一步完善了模块化系统对集合类的支持,确保
java.util
包下的集合类在模块化项目中可正常访问,减少了类路径冲突问题。
总结
Java 11 对集合类的增强以简化代码和提升可读性为核心,没有引入颠覆性的新特性,但 toArray(IntFunction)
、Stream.toList()
等方法显著减少了集合操作的模板代码,让开发者能更专注于业务逻辑。这些增强保持了对 Java 8 的兼容性,同时为后续集合框架的演进奠定了基础。