在创建时向集合添加元素

Dar*_*ian 22 java collections

如何在java中创建Set,然后在构造时向其中添加对象.我想做的事情如下:

testCollision(getObject(), new HashSet<MazeState>(){add(thing);});
Run Code Online (Sandbox Code Playgroud)

但这似乎并不合适.

fsp*_*irn 58

Java 7开始,要实例化单元素,不可变集合,您可以使用:

Collections.singleton(thing);
Run Code Online (Sandbox Code Playgroud)

返回仅包含指定对象的不可变集.返回的集是可序列化的.

- Javadoc参考:Collections.singleton(T)


Java 8中,您可以使用以下内容实例化包含任意数量对象的Set,这是对此答案的修改:

Stream.of(thing, thingToo).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)


Nik*_*bak 20

在Java 5中

new HashSet<MazeState>(Arrays.asList(thing));
Run Code Online (Sandbox Code Playgroud)

Arrays.asList(thing)将您转换thing为一个元素的列表,并从该列表集创建.

供参考:http:
//download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T ...)

  • 还考虑使用`Collections.singletonList方法` (3认同)

小智 15

从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");
Run Code Online (Sandbox Code Playgroud)

请注意,以这种方式创建的任何集/映射/列表都是不可变的(如果我的命名约定没有说服你;)


Kyl*_*lar 14

你可以使用双括号:

testCollision(getObject(), new HashSet<MazeState>(){{ add(obj1); add(obj2);}};
Run Code Online (Sandbox Code Playgroud)

要么:

Set<String> set = new HashSet<String>(){{
  add("hello");
  add("goodbye");
}};
Run Code Online (Sandbox Code Playgroud)

这称为双括号初始化,它是Java的一个鲜为人知的特性.它的作用是让编译器创建一个匿名内部类,为您创建和操作(例如,如果您的类是最终的,则无法使用它.)

现在,说过 - 我鼓励你只在你真正需要简洁的情况下使用它.更明确地说几乎总是更好,以便更容易理解您的代码.

  • "双支撑初始化"并不是一个"特征":它不是故意引入的.它只是巧妙地使用初始化块和匿名类.也许太聪明了:) (3认同)
  • 双大括号初始化还会导致创建该类的子类 iiuc。这会消耗内存,并且如果您错误地依赖其他地方的实际类,则会导致意外的失败。话虽这么说,我在测试代码中经常使用双括号初始化,因为这样发生的事情非常清楚,而且我不需要担心内存等问题。 (2认同)

小智 8

如果您不介意不变性,那么您可以使用Google Guava的ImmutableSet课程:

ImmutableSet.of(new MazeState(), new MazeState());
Run Code Online (Sandbox Code Playgroud)


Lin*_*adu 5

您可以使用 util 方法com.google.common.collect,这是一个非常好的方法:Sets.newHashSet("your value1", "your valuse2");