在创建时向集合添加元素

时间:2011-01-04 16:51:24

标签: java collections

如何在java中创建Set,然后在构造时向其中添加对象。我想做点什么:

testCollision(getObject(), new HashSet<MazeState>(){add(thing);});

但这似乎不太合适。

7 个答案:

答案 0 :(得分:56)

由于 Java 7 ,要实例化单元素不可变 Set,您可以使用:

Collections.singleton(thing);
  

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

     

- Javadoc reference: Collections.singleton(T)

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

Stream.of(thing, thingToo).collect(Collectors.toSet());

答案 1 :(得分:19)

在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...)

答案 2 :(得分: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");

观察以这种方式创建的任何集合/地图/列表将是不可变的(如果我的命名约定没有说服你;)

答案 3 :(得分:14)

您可以使用双括号:

testCollision(getObject(), new HashSet<MazeState>(){{ add(obj1); add(obj2);}};

或:

Set<String> set = new HashSet<String>(){{
  add("hello");
  add("goodbye");
}};

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

现在,说过 - 我鼓励你只在你真正需要简洁的情况下使用它。最明显的是,更容易理解你的代码。

答案 4 :(得分:8)

如果你不介意不变性,那么你可以使用Google Guava's ImmutableSet class:

ImmutableSet.of(new MazeState(), new MazeState());

答案 5 :(得分:1)

其他答案是正确的,但又想添加一种方法。使用initializer block

new HashSet<MazeState>() {

            {
                add(new MazeState());
                add(new MazeState());
            }
        };

答案 6 :(得分:1)

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