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

Java 使用嵌套集合进行双大括号初始化,java,double-brace-initialize,Java,Double Brace Initialize,我知道我可以使用双括号声明和初始化列表: // (1) List<Object> myList = new ArrayList<object>(){{ add("Object1"); add("Object2"); }}; 如何对嵌套集合使用双大括号初始化(请参见(1))?我的目标是在一行中声明和初始化数据结构 另外,我想知道使用双大括号初始化时是否有某些缺点,我必须注意。这不是一个好主意,因为它很难阅读,但您可以执行以下操作: List<Map&

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

// (1)
List<Object> myList = new ArrayList<object>(){{
    add("Object1");
    add("Object2");
}};
如何对嵌套集合使用双大括号初始化(请参见(1))?我的目标是在一行中声明和初始化数据结构


另外,我想知道使用双大括号初始化时是否有某些缺点,我必须注意。

这不是一个好主意,因为它很难阅读,但您可以执行以下操作:

List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>() {{
                    add(new HashMap<Object, Object>() {{
                        put(key, obj);
                    }});
                }};
List myList=new ArrayList(){{
添加(新的HashMap(){{
put(键,obj);
}});
}};

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

如果您正在编写代码样式指南,这种欺骗属于不要部分

如果您确实希望能够内联创建列表和映射,只需继续创建一些工厂方法。可能是这样的:

List l = Lists.of(
    Maps.of(new Entry("foo", "bar"), new Entry("bar", "baz")),
    Maps.of(new Entry("baz", "foobar"))
);

然而,Vangs示例准确地显示了您的示例的双大括号初始化语法。

只需使用“普通”初始化代码;双大括号初始化很难阅读。代码是蠕虫(一次写入,多次读取)。注意:如果这是一个静态列表,请使用静态初始值设定项。为什么要编写这样的代码?你一个人工作吗?不要使用“双括号”,因为每次这样做,你都在创建一个无用的ArrayList子类。@kolossus:为什么,我不能在我的编码标准中添加这个?可能重复@vang:谢谢你的时间和回答,但在这里你没有初始化列表:(你是什么意思?比什么新的ArrayList()是吗?@Vang:我的意思是你给了我一个在地图上放置物体的想法。这很好,但我想初始化。我的列表也是。希望你能得到它:)Vangs的例子是正确的,它创建了一个
列表
,其中恰好有一个映射,恰好有一个
key:object
条目。恐怕我们彼此不理解)通过这种方式,接受@atamanroman answer更好,双括号代码也会在测试中引发问题。例如,如果xyz是静态初始化的,您将如何模拟它?
List l = Lists.of(
    Maps.of(new Entry("foo", "bar"), new Entry("bar", "baz")),
    Maps.of(new Entry("baz", "foobar"))
);