为什么要收集文本?

2022-09-01 14:36:46

从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" }; 

我的问题是:

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

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

IMO这看起来与文字版本一样好,也相当简洁。那么为什么他们必须发明一种新的语法(编辑:“新”的意思是“Java新手”)?

  1. 当我说我实际上会得到什么?是还是别的什么?List<String> fruits = [ "Apple", "Mango", "Guava" ];ListArrayListLinkedList

1 如注释中所述,收集文字没有进入 Java 7,也没有进入 Java 8。(这是一封来自Oracle开发人员Brian Goetz的电子邮件,总结了不包括此功能的理由;这是提案本身。


答案 1

对问题2的答复:

final List<Integer> piDigits = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9];

为您提供一个不可变的列表。

这个建议的整个想法是不能指定子类型。编译器根据右侧的集合选择合适的实现。

在此处阅读详细信息:建议:收集文本

对问题1的回答:是的,它会有。这是一个风格问题。


答案 2

另一件需要注意的事情是,对于列表来说,使用var args非常容易,但是要考虑一下如何为地图执行此操作。没有办法为var args方法提供成对的参数,除非你引入一个额外的Map.Entry对象或类似的东西。

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

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

这很快就会变得非常累人。

即使你走上了使用构建器模式的道路(就像我们一样),它也非常丑陋。

Map<String,String> map = CollectionUtil.<String,String>map()
                                        .put( "key1", "value1" )
                                        .put( "key2", "value2" )
                                        .map();