我正在寻找一种紧凑的语法来实例化一个集合并为其添加一些项目。我目前使用这种语法:
Collection<String> collection =
new ArrayList<String>(Arrays.asList(new String[] { "1", "2", "3" }));
我似乎记得有一种更紧凑的方法,它使用ArrayList
的匿名子类,然后在子类的构造函数中添加项。但是,我似乎无法记住确切的语法。
答案 0 :(得分:28)
http://blog.firdau.si/2010/07/01/java-tips-initializing-collection/
List<String> s = Arrays.asList("1", "2");
答案 1 :(得分:8)
我猜你在考虑
collection = new ArrayList<String>() { // anonymous subclass
{ // anonymous initializer
add("1");
add("2");
add("3");
}
}
,其中一个是comapcted,给出了
collection = new ArrayList<String>() {{ add("1"); add("2"); add("3"); }}
FUGLY,至少可以这么说。但是,Arrays.asList方法有一个变体:Arrays.asList(T...a)
,它提供comapcity和可读性。例如,它提供以下代码行:
collection = new ArrayList<String>(Arrays.asList("1", "2", "3")); // yep, this one is the shorter
请注意,您不会创建可疑使用的ArrayList的匿名子类。
答案 2 :(得分:2)
也许那是
Collection<String> collection = new ArrayList<String>() {{
add("foo");
add("bar");
}};
也称为双括号初始化。
答案 3 :(得分:1)
您可以创建实用程序功能:
@SafeVarargs
public static <T> List<T> listOf(T ... values) {
return new ArrayList<T>(Arrays.asList(values));
}
所以你可以这样称呼它:
collection = MyUtils.listOf("1", "2", "3");
这样,您可以非常轻松地填充列表,并使其保持可变性。
答案 4 :(得分:0)
答案 5 :(得分:0)
也许这只是我,但我没有看到使事情复杂化的问题,纯粹是为了追求编写更短/更快的代码。如果选择输入的代码少一些,并且更容易调试/修改,我很确定我会选择第二个选项。
因此,除非有特别的理由要求保持这种简短,否则我会坚持使用Ockham的剃刀,并且给出了一些问题的解决方案,请选择最简单的一种。这样一来,当出现问题时(墨菲的法律明确规定它将会出现),你将有更容易的时间来追踪它。 :)