Java9 集合工厂方法解析_第1页
Java9 集合工厂方法解析_第2页
Java9 集合工厂方法解析_第3页
Java9 集合工厂方法解析_第4页
Java9 集合工厂方法解析_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第Java9集合工厂方法解析第一种方式比较扯淡,你走遍千山,你跨过弱水,只为取一瓜瓢饮,是的,你没有看错,你费尽千辛万苦只为了生成一个包含a,b,c三个元素的List,并且你要构建一个ArrayList还要仰仗Arrays.asList(“a”,“b”,“c”)这个乌七八黑的方式,它不好用不说,关键是它在短短的生命周期之后还要被GC,过程还是不可见的。。。

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

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

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

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

ListStringlist=#["a","b","c"];

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

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

一起来看看集合工厂方法

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

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

staticEListEof()

staticEListEof(Ee1)

staticEListEof(Ee1,Ee2)

staticEListEof(Ee1,Ee2,Ee3)

staticEListEof(Ee1,Ee2,Ee3,Ee4)

staticEListEof(Ee1,Ee2,Ee3,Ee4,Ee5)

staticEListEof(Ee1,Ee2,Ee3,Ee4,Ee5,Ee6)

staticEListEof(Ee1,Ee2,Ee3,Ee4,Ee5,Ee6,Ee7)

staticEListEof(Ee1,Ee2,Ee3,Ee4,Ee5,Ee6,Ee7,Ee8)

staticEListEof(Ee1,Ee2,Ee3,Ee4,Ee5,Ee6,Ee7,Ee8,Ee9)

staticEListEof(Ee1,Ee2,Ee3,Ee4,Ee5,Ee6,Ee7,Ee8,Ee9,Ee10)

staticEListEof(E...elements)

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

staticESetEof()

staticESetEof(Ee1)

staticESetEof(Ee1,Ee2)

staticESetEof(Ee1,Ee2,Ee3)

staticESetEof(Ee1,Ee2,Ee3,Ee4)

staticESetEof(Ee1,Ee2,Ee3,Ee4,Ee5)

staticESetEof(Ee1,Ee2,Ee3,Ee4,Ee5,Ee6)

staticESetEof(Ee1,Ee2,Ee3,Ee4,Ee5,Ee6,Ee7)

staticESetEof(Ee1,Ee2,Ee3,Ee4,Ee5,Ee6,Ee7,Ee8)

staticESetEof(Ee1,Ee2,Ee3,Ee4,Ee5,Ee6,Ee7,Ee8,Ee9)

staticESetEof(Ee1,Ee2,Ee3,Ee4,Ee5,Ee6,Ee7,Ee8,Ee9,Ee10)

staticESetEof(E...elements)

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

以下是List和Set的示例

importjava.util.List;

importjava.util.Set;

publicclassColDemo

publicstaticvoidmain(String[]args)

ListStringfruits=List.of("apple","orange","banana");

for(Stringfruit:fruits)

System.out.println(fruit);

fruits.add("pear");

catch(UnsupportedOperationExceptionuoe)

System.err.println("unabletomodifyfruitslist");

SetStringmarbles=Set.of("aggie","alley","steely");

for(Stringmarble:marbles)

System.out.println(marble);

marbles.add("swirly");

catch(UnsupportedOperationExceptionuoe)

System.err.println("unabletomodifymarblesset");

}

运行后输出:

apple

orange

banana

unabletomodifyfruitslist

steely

alley

aggie

unabletomodifymarblesset

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

staticK,VMapK,V

of()

staticK,VMapK,V

of(Kk1,Vv1)

staticK,VMapK,V

of(Kk1,Vv1,Kk2,Vv2)

staticK,VMapK,V

of(Kk1,Vv1,Kk2,Vv2,Kk3,Vv3)

staticK,VMapK,V

of(Kk1,Vv1,Kk2,Vv2,Kk3,Vv3,Kk4,Vv4)

staticK,VMapK,V

of(Kk1,Vv1,Kk2,Vv2,Kk3,Vv3,Kk4,Vv4,Kk5,Vv5

staticK,VMapK,V

of(Kk1,Vv1,Kk2,Vv2,Kk3,Vv3,Kk4,Vv4,Kk5,Vv5,Kk6,Vv6)

staticK,VMapK,V

of(Kk1,Vv1,Kk2,Vv2,Kk3,Vv3,Kk4,Vv4,Kk5,Vv5,Kk6,Vv6,Kk7,Vv7

staticK,VMapK,V

of(Kk1,Vv1,Kk2,Vv2,Kk3,Vv3,Kk4,Vv4,Kk5,Vv5,Kk6,Vv6,Kk7,Vv7,

Kk8,Vv8)

staticK,VMapK,V

of(Kk1,Vv1,Kk2,Vv2,Kk3,Vv3,Kk4,Vv4,Kk5,Vv5,Kk6,Vv6,Kk7,Vv7,

Kk8,Vv8,Kk9,Vv9)

staticK,VMapK,V

of(Kk1,Vv1,Kk2,Vv2,Kk3,Vv3,Kk4,Vv4,Kk5,Vv5,Kk6,Vv6,Kk7,Vv7,

Kk8,Vv8,Kk9,Vv9,Kk10,Vv10)

staticK,VMapK,V

ofEntries(Map.EntryextendsK,extendsV...entries)

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

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

Map.EntryK,Ventry(Kk,Vv)

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

importjava.util.Map;

importstaticjava.util.Map.entry;

publicclassMapDemo

publicstaticvoidmain(String[]args)

MapString,StringcapCities=

Map.ofEntries(entry("Manitoba","Winnipeg"),

entry("Alberta","Edmonton"));

capCities.forEach((k,v)-

System.out.printf("Key=%s,Value=%s%n",k,v));

capCities.put("BritishColumbia","Victoria");

catch(UnsupportedOperationExceptionuoe)

System.err.println("unabletomodifycapCitiesmap");

}

运行后输出:

K

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论