Добавление элементов в набор при создании - PullRequest
21 голосов
/ 04 января 2011

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

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

Но это не совсем верно.

Ответы [ 7 ]

56 голосов
/ 01 июля 2015

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

Collections.singleton(thing);

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

& mdash; Ссылка на Javadoc: Collections.singleton (T)


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

Stream.of(thing, thingToo).collect(Collectors.toSet());
19 голосов
/ 04 января 2011

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

15 голосов
/ 29 сентября 2017

Начиная с 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");

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

14 голосов
/ 04 января 2011

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

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

или

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

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

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

8 голосов
/ 24 сентября 2014

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

ImmutableSet.of(new MazeState(), new MazeState());
1 голос
/ 11 октября 2018

Вы можете использовать метод util из com.google.common.collect, который довольно хорош: Sets.newHashSet("your value1", "your valuse2");

1 голос
/ 04 января 2011

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

new HashSet<MazeState>() {

            {
                add(new MazeState());
                add(new MazeState());
            }
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...