Java学习笔记 —— Java 9 的 Collection 工厂方法
- 获取链接
- X
- 电子邮件
- 其他应用
Java 9引入了一些方便的方法来创建小型集合对象。
先来看下传统写法:
List<String> friends = new ArrayList<>();
friends.add("Raphael");
friends.add("Olivia");
friends.add("Thibaut");
存储三个字符串需要写上面一堆代码。我们可以简化一下,使用Arrays.asList() 工厂方法:
List<String> friends
= Arrays.asList("Raphael", "Olivia", "Thibaut");
这样我们获得一个固定大小的列表,不能向其中添加元素或从中删除元素,否则会导致UnsupportedModificationException。 不过我们可以set方法对元素进行更新:
List<String> friends = Arrays.asList("Raphael", "Olivia");
friends.set(0, "Richard");
friends.add("Thibaut");
这些行为有点奇怪,因为这里的list底层是由固定大小的可变数组支持的。
那要创建一个 Set 怎么样?没有Arrays.asSet()工厂方法,我们需要使用一些其他的技巧。 使用HashSet构造函数,接受List作为参数:
Set<String> friends
= new HashSet<>(Arrays.asList("Raphael", "Olivia", "Thibaut"));
或者可以使用 Stream API
Set<String> friends
= Stream.of("Raphael", "Olivia", "Thibaut")
.collect(Collectors.toSet());
但是,这两种解决方案都远远不够优雅,并且隐式的产生了不必要的对象分配。
另外,传统上没有优雅的方法可以创建小数据量的 Map。下面我们来看一下 Java 9 新增的工厂方法。
List 工厂
需调用工厂方法List.of即可创建列表:
List<String> friends = List.of("Raphael", "Olivia", "Thibaut");
System.out.println(friends);
不过,尝试将元素添加到 friends 列表中:
List<String> friends = List.of("Raphael", "Olivia", "Thibaut");
friends.add("Chih-Chun");
运行此代码将导致java.lang.UnsupportedOperationException
。 因为List.of 产生的列表是不可变的。 用set()方法更新项目会引发类似的异常。 不过,这种此限制是一件好事,可以避免意外修改。最后,为防止意外的错误并实现更紧凑的内部表示,不允许使用null元素。
Set 工厂
与List.of一样,您可以从元素列表中创建一个不可变的Set:
Set<String> friends = Set.of("Raphael", "Olivia", "Thibaut");
System.out.println(friends);
如果尝试通过提供重复的元素来创建Set,则会收到IllegalArgumentException。 此异常反映了Set元素的强制唯一性:
Set<String> friends = Set.of("Raphael", "Olivia", "Olivia");
Map 工厂
创建 Map 比创建 List 和 Set 要复杂一些,因为必须同时包含键和值。 在Java 9中可以通过两种方法初始化不可变 map。
可以使用工厂方法Map.of
Map<String, Integer> ageOfFriends
= Map.of("Raphael", 30, "Olivia", 25, "Thibaut", 26);
System.out.println(ageOfFriends);
如果要创建十个元素以内的小映射,此方法很方便。 要超越此范围,需要使用Map.ofEntries,该方法采用Map.Entry
import static java.util.Map.entry;
Map<String, Integer> ageOfFriends
= Map.ofEntries(entry("Raphael", 30), entry("Olivia", 25), entry("Thibaut", 26));
System.out.println(ageOfFriends);
- 获取链接
- X
- 电子邮件
- 其他应用
评论