版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东中山大学附属第一医院人体器官获取组织工作人员招聘4人笔试参考题库及答案解析
- 2026湖南怀化市溆浦县公开招聘事业单位工作人员70人笔试参考题库及答案解析
- 2026年西安碑林区柏树林社区卫生服务中心见习生招聘笔试参考试题及答案解析
- 2026年幼儿园指南理论知识
- 2026年动画设计师招聘考试题集
- 2026年会计从业资格考试仿真题解析与模拟
- 2026年中国糖画师技能等级考试预测题集
- 2026广西北海市合浦县委党校招录城镇公益性岗位人员1人笔试备考题库及答案解析
- 2026年金融学本科高频考点题
- 2026年教师年度考核工作述职
- 生物浙江宁波市三锋联盟2025-2026学年度高一年级第二(下)学期期中联考(4.22-4.24)
- 2026年二级建造师二建法规考前预测重点知识强化记忆总结笔记
- 2026云南省有色地质局楚雄勘查院下属企业招聘工作人员11人笔试备考试题及答案解析
- 心血管科试卷及分析
- 2026四川发展(控股)有限责任公司所属公司招聘5人笔试参考题库及答案解析
- 湖北省武汉市2026届高三毕业生四月调研考试语文试卷(含答案)
- 养老机构防灾避险课件
- 2026年辽宁能源集团招聘考试指南及模拟题解析
- 2026广东广州市黄埔区大沙街道招聘编外聘用人员4人备考题库及参考答案详解
- 国家事业单位招聘2025中国工艺美术馆招聘拟聘人员笔试历年参考题库典型考点附带答案详解(3卷合一)
- 企业管理 华为会议接待全流程手册SOP
评论
0/150
提交评论