【发布时间】:2011-06-03 12:38:52
【问题描述】:
如何在java中创建一个Set,然后在构造的时候给它添加对象。我想做类似的事情:
testCollision(getObject(), new HashSet<MazeState>(){add(thing);});
但这似乎不太对。
【问题讨论】:
标签: java collections
如何在java中创建一个Set,然后在构造的时候给它添加对象。我想做类似的事情:
testCollision(getObject(), new HashSet<MazeState>(){add(thing);});
但这似乎不太对。
【问题讨论】:
标签: java collections
您可以使用com.google.common.collect 中的 util 方法,这是一个相当不错的方法:Sets.newHashSet("your value1", "your valuse2");
【讨论】:
从 Java 9 开始你也可以这样做:
Set<String> immutableSet = Set.of("value1", "value2");
Set<Integer> immutableInt = Set.of(1, 2);
List<String> immutableList = List.of("item1", "item2");
Map<String, String> immutableMap = Map.of("key1", "value1", "key2", "value2", "key3", "value3");
请注意,以这种方式创建的任何 Sets/Maps/Lists 都是不可变的(如果我的命名约定没有说服您;)
【讨论】:
如果您不介意不变性,那么您可以使用Google Guava's ImmutableSet 类:
ImmutableSet.of(new MazeState(), new MazeState());
【讨论】:
从Java 7开始,要实例化一个单元素,不可变 Set,你可以使用:
Collections.singleton(thing);
返回一个只包含指定对象的不可变集合。返回的集合是可序列化的。
在 Java 8 中,您可以使用以下内容实例化包含任意数量对象的 Set,这是对 this answer 的改编:
Stream.of(thing, thingToo).collect(Collectors.toSet());
【讨论】:
你可以使用双括号:
testCollision(getObject(), new HashSet<MazeState>(){{ add(obj1); add(obj2);}};
或:
Set<String> set = new HashSet<String>(){{
add("hello");
add("goodbye");
}};
这称为双括号初始化,它是 Java 鲜为人知的特性之一。它的作用是使编译器创建一个匿名内部类,为您创建和操作(因此,例如,如果您的类是最终的,您就不能使用它。)
现在,话虽如此 - 我鼓励您仅在确实需要简洁的情况下使用它。越明确越好,这样更容易理解您的代码。
【讨论】:
其他答案是正确的,但想再添加一种方式。使用initializer block
new HashSet<MazeState>() {
{
add(new MazeState());
add(new MazeState());
}
};
【讨论】:
在 Java 5 中
new HashSet<MazeState>(Arrays.asList(thing));
Arrays.asList(thing) 将您的 thing 转换为一个元素的列表,并从该列表中创建集合。
供参考:
http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T...)
【讨论】:
Collections.singletonList method