为什么收集文字?

Gre*_*ena 28 java collections java-7

从Java 7上的各种在线文章中我已经知道Java 7将具有如下所示的集合文字1:

List<String> fruits = [ "Apple", "Mango", "Guava" ];
Set<String> flowers = { "Rose", "Daisy", "Chrysanthemum" };
Map<Integer, String> hindiNums = { 1 : "Ek", 2 : "Do", 3 : "Teen" }; 
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 难道不可能of在所有集合类中提供静态方法,可以按如下方式使用:

List<String> fruits = ArrayList.of("Apple", "Mango", "Guava");

IMO看起来和文字版本一样好,而且也相当简洁.那么为什么他们必须发明一种新的语法(编辑: '新'我的意思'新的Java'.)?

  1. 当我说List<String> fruits = [ "Apple", "Mango", "Guava" ];什么List我真的得到什么?它会是ArrayList或者LinkedList别的吗?

1正如评论中所指出的,集合文字并没有为Java 7,也不是Java 8做出决定.(这是Oracle开发人员Brian Goetz 的一封电子邮件,总结了不包括此功能的基本原理;这里是提案本身.)

Eri*_*oom 11

对问题2的回答:

final List<Integer> piDigits = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9];
Run Code Online (Sandbox Code Playgroud)

给你一个不可变的列表.

这个提议的整个想法是无法指定子类型.编译器根据右侧的集合选择合适的实现.

在此处阅读详细信息:提案:收集文字

回答问题1:是的,它会有.这是一种风格问题.


Geo*_*off 7

另外需要注意的是,对于列表来说,使用var args非常容易,但是想一想你是如何为地图做的.除非您引入额外的Map.Entry对象或类似的东西,否则无法为var args方法提供参数对.

因此,使用现有的语法,你最终会得到

Map<String,String> map = HashMap.of( new Entry( "key1", "value1" ), 
                                     new Entry( "key2", "value2" ) );
Run Code Online (Sandbox Code Playgroud)

哪会很快累.

即使你沿着使用构建器模式的路径(正如我们所做的那样),那也很难看

Map<String,String> map = CollectionUtil.<String,String>map()
                                        .put( "key1", "value1" )
                                        .put( "key2", "value2" )
                                        .map();
Run Code Online (Sandbox Code Playgroud)