千家信息网

Java9中集合工厂方法的示例分析

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关Java9中集合工厂方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使集合框架更便捷的工厂方法JEP269中提议,为集合框架增添一些工
千家信息网最后更新 2026年11月03日Java9中集合工厂方法的示例分析

这篇文章给大家分享的是有关Java9中集合工厂方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

使集合框架更便捷的工厂方法

JEP269中提议,为集合框架增添一些工厂方法,来使创建不可变集合类与含有少量元素的Map变得更加便捷。下文就为什么它们应运而生来展开详细的阐述。

集合框架增加工厂方法是必然的结果

Java饱受其语法臃肿的批评,比如,创建一个小而确定的集合类时(比如一个List),需要使用它的构造方法,然后将它的引用存放在局部变量中,通过引用来多次调用add()方法之后, 最后才来封装这个集合以获得不可变的视图。

早先的使用过程如下

List list = new ArrayList<>();list.add("a");list.add("b");list.add("c");list = Collections.unmodifiableList(list);

上面这个语法如此臃肿的例子在先前的版本中并不能够简化,不可变的静态集合必须在静态初始块中来填充,而不是使用更加方便的字段表达式。但是,

也不得不提一下下面这些单语句表达式

List list1 =    Collections.unmodifiableList(new ArrayList<>(Arrays.asList("a", "b", "c")));List list2 =    Collections.unmodifiableList(new ArrayList() {{ add("a"); add("b"); add("c"); }});List list3 =    Collections.unmodifiableList(Stream.of("a", "b", "c").collect(toList()));
  • 第一种方式比较扯淡,你走遍千山,你跨过弱水,只为取一瓜瓢饮,是的,你没有看错,你费尽千辛万苦只为了生成一个包含a,b,c三个元素的List,并且你要构建一个ArrayList还要仰仗Arrays.asList("a", "b", "c")这个乌七八黑的方式,它不好用不说,关键是它在短短的生命周期之后还要被GC,过程还是不可见的。。。

  • 第二种好像看上去没那么扯淡,使用一个匿名内部类的实例初始化构造器来减少代码臃肿度,看上去很完美,但是可能会发生内存泄漏或者序列化的问题,因为它每次使用都会耗费额外的资源,还包含对封闭实例和任何捕获对象的隐藏引用。

  • 第三种方式是使用Java8的Streams API来完成的,虽然代码没那么臃肿,但是过程中也涉及到了不必要的对象创建。此外,Streams API不能用来构建Map, 除非值是经键计算而来或者stream的元素包含键值对。

为解决这些问题,JEP186提议了集合字面量的概念,集合字面量是一种句法表达式,采用一种类数组的方式,来创建List、Map或者其它的集合类

下面是其原始类型的简明表达方式

List list = #[ "a", "b", "c" ];

没有任何新的语言特性,一切就像我们所思所想那样简明,但是这种集合字面量为什么没有被整合到Java9中去呢?取而代之的是,Java9采用了工厂方法来替代它,这其实是为了使语言改动尽量最小化,采用现有的方式,生产语法糖来达到这个目的的。

如此,集合工厂方法应运而生了。

一起来看看集合工厂方法

JEP 269的工厂方法受到类java.util.Collection和java.util.EnumSet类中的类似工厂方法的启发。 Collection提供用于创建空List,java.util.Set和Map的工厂方法,以及创建具有一个元素或键值对的单例List,Set和Map。 EnumSet提供了几个重载的of(…)工厂方法,它们采用固定或可变数量的参数,是为了更方便地创建指定元素的EnumSet。Java 9中的EnumSet模型的of()方法提供一致和通用的方式来创建包含任意类型对象的List,Set和Map。

以下工厂方法已添加到List接口中

static  List of()static  List of(E e1)static  List of(E e1, E e2)static  List of(E e1, E e2, E e3)static  List of(E e1, E e2, E e3, E e4)static  List of(E e1, E e2, E e3, E e4, E e5)static  List of(E e1, E e2, E e3, E e4, E e5, E e6)static  List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7)static  List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8)static  List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) static  List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10)static  List of(E... elements)

以下工厂方法已添加到Set接口中

static  Set of()static  Set of(E e1)static  Set of(E e1, E e2)static  Set of(E e1, E e2, E e3)static  Set of(E e1, E e2, E e3, E e4)static  Set of(E e1, E e2, E e3, E e4, E e5)static  Set of(E e1, E e2, E e3, E e4, E e5, E e6)static  Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7)static  Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8)static  Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9)static  Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10)static  Set of(E... elements)

在每个方法列表中, 第一个方法创建一个空的不可修改的集合。接下来的10个方法可创建1-10个元素的不可修改集合。尽管这些方法比较混乱,但它们避免了final类型的可变参方法产生的数组分配,初始化和垃圾回收开销,这种方法还支持任意大小的集合。

以下是List和Set的示例

import java.util.List;import java.util.Set;public class ColDemo{   public static void main(String[] args)   {      List fruits = List.of("apple", "orange", "banana");      for (String fruit: fruits)         System.out.println(fruit);      try      {         fruits.add("pear");      }      catch (UnsupportedOperationException uoe)      {         System.err.println("unable to modify fruits list");      }      Set marbles = Set.of("aggie", "alley", "steely");      for (String marble: marbles)         System.out.println(marble);      try      {         marbles.add("swirly");      }      catch (UnsupportedOperationException uoe)      {         System.err.println("unable to modify marbles set");      }   }}

运行后输出:

apple
orange
banana
unable to modify fruits list
steely
alley
aggie
unable to modify marbles set

以下工厂方法则添加到Map接口中

static  Map    of()static  Map    of(K k1, V v1)static  Map    of(K k1, V v1, K k2, V v2)static  Map    of(K k1, V v1, K k2, V v2, K k3, V v3)static  Map    of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4)static  Map    of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5    static  Map    of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6)static  Map    of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7    static  Map    of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7,       K k8, V v8)static  Map    of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7,       K k8, V v8, K k9, V v9)static  Map    of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7,       K k8, V v8, K k9, V v9, K k10, V v10)static  Map    ofEntries(Map.Entry... entries)

第一个方法创建了一个空的不可变的Map,接下来10个方法创建包含1-10和键值对的Map,尽管这些方法比较混乱,但它们避免了final类型的可变参方法产生的数组分配,初始化和垃圾回收开销,且支持任意大小的Map。

虽然Map的可变参数方法近似List和Set的,但是它的每个键值对必须被包装起来,下面这个方法可以方便地将包装键值对转换为Map标准键值对:

Map.Entry entry(K k, V v)

下面是Map的ofEntries() 和entry()方法的示例

import java.util.Map;import static java.util.Map.entry;public class MapDemo{   public static void main(String[] args)   {      Map capCities =          Map.ofEntries(entry("Manitoba", "Winnipeg"),                        entry("Alberta", "Edmonton"));      capCities.forEach((k, v) ->                         System.out.printf("Key = %s, Value = %s%n", k, v));      try      {         capCities.put("British Columbia", "Victoria");      }      catch (UnsupportedOperationException uoe)      {         System.err.println("unable to modify capCities map");      }   }}

运行后输出:

Key = Alberta, Value = Edmonton
Key = Manitoba, Value = Winnipeg
unable to modify capCities map

注意,未来的JDK版本可能会让开发者指定值类型来减少包装键值对所带来的性能开销,从entry()方法可以看出,通过它返回一个新的实现自Map.Entry的具体引用类型,我想这是为了后面把潜在特性迁移到值类型中去设下的铺垫吧。

感谢各位的阅读!关于"Java9中集合工厂方法的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

方法 工厂 可变 方式 类型 元素 示例 臃肿 字面 对象 开销 接口 数组 框架 表达式 语法 过程 中集 分析 便捷 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡豆 手冲咖啡和咖啡机区别 天津市摩尔互联网科技 互联网科技工作委员会 厦门中拓互联网络科技有限公司 互联网科技公司税收优惠 互联网科技的发展 互联网与新科技 滨湖区互联网智能科技产品供应 成都玖崟互联网科技有限公司乐商圈怎么样 中盈科技互联网信息有限公司 重庆威客帮互联网科技 广州恒生互联网科技有限 彤创互联网科技有限公司 世界互联网科技公司市值排名 众安科技工业互联网合作 21世纪互联网科技成就 互联网科技快讯热点 保山浩联互联网科技有限公司 知域互联网科技有限公司官网 互联网科技工作委员会副主任毛军 互联网科技活动banner 鸠鸠互联网科技 鑫亿盛互联网科技 深圳期待互联网科技 太原新华互联网科技学校怎么样 受益于互联网科技的高速发展 互联网科技大赛获奖感言 江苏互联网智能科技产品出厂价 广州智享互联网科技
0