Я шукаю дуже простий спосіб створити набір.
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)
В JDK не існує реалізації "фіксованого розміру" Set
всередині Arrays
класу. Чому ти цього хочеш? А Set
гарантія , що не існує ніяких дублікатів, але якщо ви набираєте їх вручну, ви не повинні , що функціональність ... і List
є кілька методів. Обидва інтерфейси поширюються Collection
і Iterable
.
Як говорили інші, використовуйте гуаву. Якщо ви дійсно хочете цієї функціональності - оскільки її немає в 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 ...) .