java9新特性-JEP 269:集合类便利的工厂方法
来源:互联网 发布:烟袋斜街10号 网络剧9 编辑:程序博客网 时间:2024/05/29 13:14
翻译(部分翻译)自:http://openjdk.java.net/jeps/269
Summary
当需要只包含几个元素的Collection或Map的实例时,可以更加方便地创建,以解决java语言中没有集合类或Map的字面量问题。
Goals
在Collection或Map接口中提供静态工厂方法,以便创建简洁的、不可修改的实例对象。
Non-Goals
并不是以创建高性能和包含任意数量的元素的实例对象为目标,而是主要用在小的Collection和Map上。
并不是为了提供不可修改的Collection和Map类型,尽管这些工厂方法所产生的实例是不可修改的。
Motivation
java一直因为它的代码冗长为人所诟病。例如,创建一个小的、不可修改的Collection或Map,以Set为例,要(1)实例化,(2)保存在一个局部变量,(3)几次调用add方法,(4)然后包装它。
Set<String> set = new HashSet<>(); //(1) (2)set.add("a"); // (3)set.add("b"); // (3)set.add("c"); // (3)set = Collections.unmodifiableSet(set); // (4)
这太啰嗦了。
另一种方式是:
Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c")));
这依然很啰嗦,看起来一点也不够清晰,在创建set之前还要创建一个list。
另外一种方式被称为“double brace”:
Set<String> set = Collections.unmodifiableSet(new HashSet<>{ { add("a"); add("b"); add("c"); }});
这种方式是使用的匿名内部类和实例代码块,这种方式会额外消耗一个类。匿名内部类持有外部引用会引起内存泄露问题,这种方法最好避免。(为什么会引起内存泄露?)
另一种方法是使用java8中的Stream API,
Set<String> set = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(toSet()));
这多多少少还是很啰嗦的。它包含了一些不必要的操作。
在过去,有很多的关于修改java语言以支持Collection和Map字面量的提议。
通过以最小的代价和风险来修改java以支持集合类字面量操作,最终java9中新的方式为:
Set<String> set = Set.of("a", "b", "c");
Description
在List、Set和Map接口中提供静态工厂方法以创建小的且不可修该的实例对象。
List.of(a, b, c);Map.of();Map.of(k1, v1);Map.of(k1, v1, k2, v2);Map.of(k1, v1, k2, v2, k3, v3);Map.ofEntries(Map.Entry<K, V>...)Map.ofEntries( entry(k1, v1), entry(k2, v2), entry(k3, v3), // ... entry(kn, vn));
还没有写完!!!!
- java9新特性-JEP 269:集合类便利的工厂方法
- Java9 集合工厂方法
- Java9的新特性
- Java9的新特性
- Java9 的几个新特性
- Java9新特性介绍
- java9 新特性
- Java9新特性介绍
- Java9新特性
- java9新特性
- Java9 新特性
- JAVA9新特性
- Java9 新特性
- Java9新特性调研
- java9 新特性
- 解读java9新特性
- Java9新特性
- Java9新特性
- HTML-常用CSS解析
- Hash的计算方案
- 0071 性格测试
- 爬虫抓取百度贴吧帖子标题及作者
- HDU 1575 Tr A
- java9新特性-JEP 269:集合类便利的工厂方法
- 校招准备系列:每天一道算法题(11)-替换空格
- C++之STL vector解析(2)---《C++ STL》
- fastdfs介绍与工作原理
- Codeforces 101243 B Hanoi tower
- CENTOS 7 如何设置防火墙
- 洛谷 2663 越越的组队 【dp】
- Redis数据结构-SDS
- 链表1