我知道我可以使用双括号声明和初始化List
:
// (1)
List<Object> myList = new ArrayList<object>(){{
add("Object1");
add("Object2");
}};
但我想要List
<Map<Object,Object>>
:
// (2)
List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>();
如何使用嵌套集合的双括号初始化(参见(1))?我的目标是在一行中声明和初始化数据结构。
此外,我想知道使用双支架初始化时是否存在某些缺点,我必须注意。
答案 0 :(得分:10)
避免双括号初始化,因为它a)让同事惊讶并且难以阅读,b)损害性能和c)可能导致对象相等的问题(每个创建的对象都有一个唯一的类对象)。
如果你正在处理代码风格指南,那么这种技巧属于不要部分。
如果您真的希望能够内联创建列表和地图,请继续创建一些工厂方法。可能看起来像这样:
List l = Lists.of(
Maps.of(new Entry("foo", "bar"), new Entry("bar", "baz")),
Maps.of(new Entry("baz", "foobar"))
);
但是,Vangs示例确切地说明了示例的语法如何用于双括号初始化。
答案 1 :(得分:5)
这不是个好主意,因为它难以阅读,但你可以这样做:
List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>() {{
add(new HashMap<Object, Object>() {{
put(key, obj);
}});
}};