我需要创建一个具有初始值的集合。
Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");
是否有一种方法可以在一行代码中做到这一点?例如,它对于最终的静态字段很有用。
我需要创建一个具有初始值的集合。
Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");
是否有一种方法可以在一行代码中做到这一点?例如,它对于最终的静态字段很有用。
当前回答
(丑陋)双大括号初始化没有副作用:
Set<String> a = new HashSet<>(new HashSet<String>() {{
add("1");
add("2");
}})
但在某些情况下,如果我们提到这是一个使最终集合不可变的好味道,它可能真的很有用:
final Set<String> a = Collections.unmodifiableSet(new HashSet<String>(){{
add("1");
add("2");
}})
其他回答
我觉得最有可读性的是简单地使用谷歌番石榴:
Set<String> StringSet = Sets.newHashSet("a", "b", "c");
这是可变的。
集合字面值计划在Java 7中使用,但最终没有加入。所以还没有自动的东西。
你可以使用番石榴的套装:
Sets.newHashSet("a", "b", "c")
或者你可以使用下面的语法,这将创建一个匿名类,但它是hack:
Set<String> h = new HashSet<String>() {{
add("a");
add("b");
}};
使用Java 9,你可以做到以下几点:
Set.of("a", "b");
你会得到一个包含元素的不可变集合。具体操作请参见接口Set的Oracle文档。
随着java9和方便的工厂方法的发布,这可以以一种更干净的方式实现:
Set set = Set.of("a", "b", "c");
有几种方法:
双大括号初始化
这是一种创建匿名内部类的技术,它有一个实例初始化器,在创建实例时将string添加到自身:
Set<String> s = new HashSet<String>() {{
add("a");
add("b");
}}
请记住,这实际上会在每次使用HashSet时创建一个新的子类,尽管不必显式地编写一个新的子类。
一种实用方法
编写一个返回Set的方法并不是太难写:
public static Set<String> newHashSet(String... strings) {
HashSet<String> set = new HashSet<String>();
for (String s : strings) {
set.add(s);
}
return set;
}
上面的代码只允许使用String类型,但是允许使用任何使用泛型的类型应该不会太难。
利用图书馆
许多库都有一个方便的方法来初始化集合对象。
例如,谷歌Collections有一个Sets.newHashSet(T…)方法,该方法将用特定类型的元素填充HashSet。