Java 用于实例化初始化集合的压缩语法

Java 用于实例化初始化集合的压缩语法,java,collections,initialization,Java,Collections,Initialization,我正在寻找用于实例化集合并向其中添加一些项的紧凑语法。我目前使用以下语法: Collection<String> collection = new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" })); 集合= 新的ArrayList(Arrays.asList(新字符串[]{“1”、“2”、“3”})); 我似乎还记得,有一种更简洁的方法可以做到这一点,即使用ArrayList的匿

我正在寻找用于实例化集合并向其中添加一些项的紧凑语法。我目前使用以下语法:

Collection<String> collection = 
    new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" }));
集合=
新的ArrayList(Arrays.asList(新字符串[]{“1”、“2”、“3”}));
我似乎还记得,有一种更简洁的方法可以做到这一点,即使用
ArrayList
的匿名子类,然后在子类的构造函数中添加项。但是,我似乎记不起确切的语法。

可能是这样

Collection<String> collection = new ArrayList<String>() {{
    add("foo");
    add("bar");
}};
Collection=newarraylist(){{
添加(“foo”);
添加(“酒吧”);
}};

也称为双括号初始化。

请参见

我想您正在考虑

collection = new ArrayList<String>() { // anonymous subclass
     { // anonymous initializer
         add("1");
         add("2");
         add("3");
     }
}
请注意,您没有创建使用可疑的ArrayList的匿名子类。

List s=Arrays.asList(“1”、“2”);

也许只有我一个人,但我不认为把事情复杂化有什么意义,纯粹是为了编写更短/更快的代码。考虑到输入的代码行数要少一些,调试/修改要容易得多,我很确定我会选择第二个选项


因此,除非有特别的理由推动保持这个简短,否则我会说坚持奥克姆剃刀,并给出一个问题的许多解决方案,使用最简单的解决方案。这样,当某件事确实出了问题(墨菲定律明确规定它会出问题)时,你就可以更容易地跟踪它了

您可以创建一个实用功能:

@SafeVarargs
public static <T> List<T> listOf(T ... values) {
    return new ArrayList<T>(Arrays.asList(values));
}

通过这种方式,您可以非常轻松地填充列表,并且仍然保持其可变。

只有在不需要结果可扩展的情况下才可以这样工作。
collection = new ArrayList<String>(Arrays.asList("1", "2", "3")); // yep, this one is the shorter
List<String> s = Arrays.asList("1", "2");
@SafeVarargs
public static <T> List<T> listOf(T ... values) {
    return new ArrayList<T>(Arrays.asList(values));
}
collection = MyUtils.listOf("1", "2", "3");