Ich muss eine Set
mit Anfangswerten.
Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");
Gibt es eine Möglichkeit, dies in einer einzigen Codezeile zu tun? Es ist zum Beispiel nützlich für ein endgültiges statisches Feld.
Ich muss eine Set
mit Anfangswerten.
Set<String> h = new HashSet<String>();
h.add("a");
h.add("b");
Gibt es eine Möglichkeit, dies in einer einzigen Codezeile zu tun? Es ist zum Beispiel nützlich für ein endgültiges statisches Feld.
Nur ein kleiner Hinweis: Unabhängig davon, welchen der hier genannten Ansätze Sie wählen, ist es eine gute Idee, diesem Muster zu folgen, wenn es sich um eine Voreinstellung handelt, die normalerweise nicht geändert wird (wie eine Voreinstellung in einer Bibliothek, die Sie erstellen):
// Initialize default values with the method you prefer, even in a static block
// It's a good idea to make sure these defaults aren't modifiable
private final static Set<String> DEFAULT_VALUES = Collections.unmodifiableSet(...);
private Set<String> values = DEFAULT_VALUES;
Der Nutzen hängt von der Anzahl der Instanzen ab, die Sie von dieser Klasse erstellen, und davon, wie wahrscheinlich es ist, dass die Standardeinstellungen geändert werden.
Wenn Sie sich für dieses Muster entscheiden, können Sie auch die Methode der Set-Initialisierung wählen, die am lesbarsten ist. Die geringen Effizienzunterschiede zwischen den verschiedenen Methoden spielen wahrscheinlich keine große Rolle, da Sie die Menge nur einmal initialisieren werden.
(ugly) Double Brace Initialisierung ohne Nebenwirkungen:
Set<String> a = new HashSet<>(new HashSet<String>() {{
add("1");
add("2");
}})
Aber in einigen Fällen, wenn wir erwähnt, dass ist ein guter Geruch, um endgültige Sammlungen unveränderlich zu machen, könnte es wirklich nützlich sein:
final Set<String> a = Collections.unmodifiableSet(new HashSet<String>(){{
add("1");
add("2");
}})
Etwas umständlich, funktioniert aber ab Java 5:
Set<String> h = new HashSet<String>(Arrays.asList(new String[] {
"a", "b"
}))
Verwenden Sie eine Hilfsmethode, um es lesbar zu machen:
Set<String> h = asSet ("a", "b");
public Set<String> asSet(String... values) {
return new HashSet<String>(java.util.Arrays.asList(values));
}
Verwendung von Java 8 können wir schaffen HashSet
als:
Stream.of("A", "B", "C", "D").collect(Collectors.toCollection(HashSet::new));
Und wenn wir eine unveränderbare Menge wollen, können wir eine Utility-Methode wie :
public static <T, A extends Set<T>> Collector<T, A, Set<T>> toImmutableSet(Supplier<A> supplier) {
return Collector.of(
supplier,
Set::add, (left, right) -> {
left.addAll(right);
return left;
}, Collections::unmodifiableSet);
}
Diese Methode kann verwendet werden als:
Stream.of("A", "B", "C", "D").collect(toImmutableSet(HashSet::new));
Kann statischen Block für die Initialisierung verwenden:
private static Set<Integer> codes1=
new HashSet<Integer>(Arrays.asList(1, 2, 3, 4));
private static Set<Integer> codes2 =
new HashSet<Integer>(Arrays.asList(5, 6, 7, 8));
private static Set<Integer> h = new HashSet<Integer>();
static{
h.add(codes1);
h.add(codes2);
}
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
3 Stimmen
Für Java 8, Java 9 und Java 10 siehe meine Antwort stackoverflow.com/a/37406054/1216775
2 Stimmen
Die Antwort von Michael Berdyshev ist eigentlich die beste, weil sie die sauberste Art ist, eine abänderbar Set. i_am_zero Answer hat auch eine andere Möglichkeit, ein veränderbares Set zu erstellen, aber es ist ausführlicher/umständlicher [mit Lambda-Streaming]; ansonsten ist i_am_zero Answer die nächstbeste Lösung für die Breite seiner verschiedenen Optionen (über Java-Versionen hinweg).
0 Stimmen
HINWEIS: Einige Antworten lassen den Parameter `new HashSet<T>(int initialCapacity) weg, wenn Sie die Größe der Sammlung bereits kennen, verwenden Sie ihn.