Ich suche nach einer sehr einfachen Möglichkeit, ein Set zu erstellen.
Arrays.asList("a", "b" ...)
erstellt eine List<String>
Gibt es etwas Ähnliches für Set
?
Ich suche nach einer sehr einfachen Möglichkeit, ein Set zu erstellen.
Arrays.asList("a", "b" ...)
erstellt eine List<String>
Gibt es etwas Ähnliches für Set
?
Antworten:
Mit Java 8 können Sie dies jetzt tun, ohne ein Framework von Drittanbietern zu benötigen:
Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());
Siehe Sammler .
Genießen!
Mit Guava ist es so einfach:
Set<String> mySet = ImmutableSet.<String> of("a", "b");
Oder für eine veränderliche Menge:
Set<String> mySet = Sets.newHashSet("a", "b")
Weitere Datentypen finden Sie im Guava-Benutzerhandbuch
Sets.newHashSet("a", "b")
oderSets.newLinkedHashSet("a", "b")
Sets.newLinkedHashSet()
nicht mit dieser Unterschrift, sorry
Set<String> mySet = ImmutableSet.of("a", "b");
Du könntest benutzen
new HashSet<String>(Arrays.asList("a","b"));
Für die Sonderfälle von Sätzen mit null oder einem Mitglied können Sie Folgendes verwenden:
java.util.Collections.EMPTY_SET
und:
java.util.Collections.singleton("A")
java.util.Collections.emptySet()
wird meiner Meinung nach aus Gründen der Typensicherheit EMPTY_SET vorgezogen. Aus den Kommentaren in der Collections-Klasse:Unlike the like-named field, this method is parameterized.
Wie andere gesagt haben, verwenden Sie:
new HashSet<String>(Arrays.asList("a","b"));
Der Grund, warum dies in Java nicht existiert, ist, dass Arrays.asList
eine Liste mit fester Größe zurückgegeben wird, mit anderen Worten:
public static void main(String a[])
{
List<String> myList = Arrays.asList("a", "b");
myList.add("c");
}
Kehrt zurück:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(Unknown Source)
at java.util.AbstractList.add(Unknown Source)
Es gibt keine JDK-Implementierung einer "festen Größe" Set
innerhalb der Arrays
Klasse. Warum willst du das? A Set
garantiert, dass es keine Duplikate gibt, aber wenn Sie sie von Hand eingeben, sollten Sie diese Funktionalität nicht benötigen ... und List
verfügt über mehr Methoden. Beide Schnittstellen erweitern Collection
und Iterable
.
Verwenden Sie, wie andere gesagt haben, Guave, wenn Sie diese Funktionalität wirklich wollen - da sie nicht im JDK enthalten ist. Informationen dazu finden Sie in ihren Antworten (insbesondere in der Antwort von Michael Schmeißer).
In Java 9 wurde eine ähnliche Funktion über Factory-Methoden hinzugefügt:
Set<String> oneLinerSet = Set.of("a", "b", ...);
(Es gibt auch Äquivalente für List
.)
Nein, aber du kannst es so machen
new HashSet<String>(Arrays.asList("a", "b", ...));
Hier ist eine kleine Methode, die Sie verwenden können
/**
* 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));
}
Eine andere Möglichkeit, dies mit Java 8 und Enums zu tun, wäre:
Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);
Siehe EnumSet .
Ich würde eine Leistungsanalyse zwischen diesem Ansatz und empfehlen
Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());
Denn wenn Sie mehr als fünf Elemente haben, gibt das Javadoc der Methode an, dass es sich möglicherweise um Leistungsprobleme handelt, wie Sie im Javadoc von Set.Of (E, E ...) sehen können .