8

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

// (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))?我的目标是在一行中声明和初始化数据结构。

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

4

2 回答 2

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 示例准确地显示了您的示例的语法是如何用于双括号初始化的。

于 2015-02-09T13:09:59.683 回答
5

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

List<Map<Object,Object>> myList = new ArrayList<Map<Object,Object>>() {{
                    add(new HashMap<Object, Object>() {{
                        put(key, obj);
                    }});
                }};
于 2015-02-09T13:01:11.633 回答