Как создать набор в java, а затем добавить к нему объекты, когда он будет создан. Я хочу сделать что-то вроде:
testCollision(getObject(), new HashSet<MazeState>(){add(thing);});
Но это не кажется правильным.
Как создать набор в java, а затем добавить к нему объекты, когда он будет создан. Я хочу сделать что-то вроде:
testCollision(getObject(), new HashSet<MazeState>(){add(thing);});
Но это не кажется правильным.
В 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...)
Поскольку Java 7, для создания одноэлементного неизменяемого набора, вы можете использовать:
Collections.singleton(thing);
Возвращает неизменяемый набор, содержащий только указанный объект. Возвращаемый набор сериализуем.
В Java 8 вы можете создать набор, содержащий любое количество ваших объектов, следующим образом: адаптация этого ответа:
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. То, что он делает, - это заставить компилятор создать анонимный внутренний класс, который создает и манипулирует вами (например, если ваш класс был окончательным, вы не могли его использовать.)
Теперь, сказав это, я бы посоветовал вам использовать его только в тех случаях, когда вам действительно нужна краткость. Почти всегда лучше быть более явным, так что вам легче понять ваш код.
С 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");
Соблюдайте, что все созданные/созданные наборы/Карты/списки будут неизменными (если мое соглашение об именах не убедило вас;)
Если вы не возражаете против неизменности, вы можете использовать класс Google Guava ImmutableSet
:
ImmutableSet.of(new MazeState(), new MazeState());
Другие ответы правильные, но вы хотите добавить еще один способ: блок инициализации
new HashSet<MazeState>() {
{
add(new MazeState());
add(new MazeState());
}
};