Подтвердить что ты не робот

Добавление элементов в набор при создании

Как создать набор в java, а затем добавить к нему объекты, когда он будет создан. Я хочу сделать что-то вроде:

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

Но это не кажется правильным.

4b9b3361

Ответ 2

Поскольку Java 7, для создания одноэлементного неизменяемого набора, вы можете использовать:

Collections.singleton(thing);

Возвращает неизменяемый набор, содержащий только указанный объект. Возвращаемый набор сериализуем.

Ссылка Javadoc: Collections.singleton(T)


В Java 8 вы можете создать набор, содержащий любое количество ваших объектов, следующим образом: адаптация этого ответа:

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

Ответ 3

Вы можете использовать двойные фигурные скобки:

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

или

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

Это называется инициализацией с двойной привязкой, и это одна из менее известных функций Java. То, что он делает, - это заставить компилятор создать анонимный внутренний класс, который создает и манипулирует вами (например, если ваш класс был окончательным, вы не могли его использовать.)

Теперь, сказав это, я бы посоветовал вам использовать его только в тех случаях, когда вам действительно нужна краткость. Почти всегда лучше быть более явным, так что вам легче понять ваш код.

Ответ 4

С 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");

Соблюдайте, что все созданные/созданные наборы/Карты/списки будут неизменными (если мое соглашение об именах не убедило вас;)

Ответ 5

Если вы не возражаете против неизменности, вы можете использовать класс Google Guava ImmutableSet:

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

Ответ 6

Другие ответы правильные, но вы хотите добавить еще один способ: блок инициализации

new HashSet<MazeState>() {

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