使用嵌套集合进行双括号初始化

Arv*_*rma 8 java double-brace-initialize

我知道我可以List使用双括号声明和初始化:

// (1)
List<Object> myList = new ArrayList<object>(){{
    add("Object1");
    add("Object2");
}};
Run Code Online (Sandbox Code Playgroud)

但我想List<Map<Object,Object>>:

// (2)
List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>();
Run Code Online (Sandbox Code Playgroud)

如何使用嵌套集合的双括号初始化(参见(1))?我的目标是在一行中声明和初始化数据结构.

另外我想知道使用双支撑初始化时是否存在某些缺点我必须注意.

ata*_*man 10

避免双括号初始化,因为它a)让同事惊讶并且难以阅读,b)损害性能和c)可能导致对象相等的问题(每个创建的对象都有一个唯一的类对象).

如果您正在处理代码样式指南,那么这种技巧属于" 不要"部分.

如果您真的希望能够内联创建列表和地图,那么请继续创建一些工厂方法.看起来像这样:

List l = Lists.of(
    Maps.of(new Entry("foo", "bar"), new Entry("bar", "baz")),
    Maps.of(new Entry("baz", "foobar"))
);
Run Code Online (Sandbox Code Playgroud)

但是,Vangs示例确切地说明了示例的语法如何用于双括号初始化.


Bra*_*bra 5

这不是一个好主意,因为它很难阅读,但你可以做到以下几点:

List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>() {{
                    add(new HashMap<Object, Object>() {{
                        put(key, obj);
                    }});
                }};
Run Code Online (Sandbox Code Playgroud)

  • 你什么意思?比新的ArrayList <Map <Object,Object >>()是什么? (2认同)
  • Vangs示例是正确的,并创建一个`List <Map <Object,Object >>`,其中只有一个映射只有一个`key:object`条目. (2认同)