Я ищу очень простой способ создать Сет.
Arrays.asList("a", "b" ...)
создает List<String>
Есть что-нибудь подобное Set
?
Я ищу очень простой способ создать Сет.
Arrays.asList("a", "b" ...)
создает List<String>
Есть что-нибудь подобное Set
?
Ответы:
Теперь с Java 8 вы можете делать это без сторонней инфраструктуры:
Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());
См. Коллекционеры .
Наслаждайтесь!
Используя Guava , это очень просто:
Set<String> mySet = ImmutableSet.<String> of("a", "b");
Или для изменяемого набора:
Set<String> mySet = Sets.newHashSet("a", "b")
Дополнительные типы данных см. В руководстве пользователя Guava.
Sets.newHashSet("a", "b")
илиSets.newLinkedHashSet("a", "b")
Sets.newLinkedHashSet()
не существует с этой подписью, извините
Set<String> mySet = ImmutableSet.of("a", "b");
Вы могли бы использовать
new HashSet<String>(Arrays.asList("a","b"));
Для особых случаев наборов с одним или одним элементом можно использовать:
java.util.Collections.EMPTY_SET
и:
java.util.Collections.singleton("A")
java.util.Collections.emptySet()
на мой взгляд, предпочтительнее EMPTY_SET из-за безопасности типов. Из комментариев в классе «Коллекции»:Unlike the like-named field, this method is parameterized.
Как говорили другие, используйте:
new HashSet<String>(Arrays.asList("a","b"));
Причина, по которой этого не существует в Java, заключается в том, что он Arrays.asList
возвращает список фиксированного размера, другими словами:
public static void main(String a[])
{
List<String> myList = Arrays.asList("a", "b");
myList.add("c");
}
Возврат:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
Set
Внутри Arrays
класса нет реализации JDK «фиксированного размера» . а зачем тебе это? A Set
гарантирует отсутствие дубликатов, но если вы набираете их вручную, вам не понадобится эта функциональность ... и List
есть больше методов. Оба интерфейса расширяются Collection
и Iterable
.
Как говорили другие, используйте guava, если вам действительно нужна эта функциональность - поскольку ее нет в JDK. Посмотрите их ответы (в частности, ответ Михаэля Шмайсера), чтобы узнать об этом.
В Java 9 аналогичная функция была добавлена с помощью фабричных методов:
Set<String> oneLinerSet = Set.of("a", "b", ...);
(Есть и эквиваленты List
.)
Нет, но ты можешь сделать это вот так
new HashSet<String>(Arrays.asList("a", "b", ...));
Вот небольшой метод, который вы можете использовать
/**
* Utility method analogous to {@link java.util.Arrays#asList(Object[])}
*
* @param ts
* @param <T>
* @return the set of all the parameters given.
*/
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> Set<T> asSet(T... ts) {
return new HashSet<>(Arrays.asList(ts));
}
Другой способ сделать это с использованием Java 8 и перечислений:
Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);
См. EnumSet .
Я бы рекомендовал провести анализ производительности между этим подходом и
Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());
потому что, если у вас более пяти элементов, в javadoc метода указано, что могут возникнуть проблемы с производительностью, как вы можете видеть в javadoc Set.Of (E, E ...) .