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.
Das Builder-Muster könnte hier von Nutzen sein. Heute hatte ich das gleiche Problem. wo ich brauchte Set mutating Operationen, um mir eine Referenz des Set-Objekts, so kann ich es an Super-Klasse Konstruktor übergeben, so dass sie auch weiterhin zu den gleichen Satz, indem sie wiederum konstruieren eine neue StringSetBuilder aus dem Set, dass die Kind-Klasse gerade gebaut. Die Builder-Klasse, die ich geschrieben habe, sieht wie folgt aus (in meinem Fall ist es eine statische innere Klasse einer äußeren Klasse, aber es kann auch eine eigene unabhängige Klasse sein):
public interface Builder<T> {
T build();
}
static class StringSetBuilder implements Builder<Set<String>> {
private final Set<String> set = new HashSet<>();
StringSetBuilder add(String pStr) {
set.add(pStr);
return this;
}
StringSetBuilder addAll(Set<String> pSet) {
set.addAll(pSet);
return this;
}
@Override
public Set<String> build() {
return set;
}
}
Beachten Sie die addAll()
y add()
Methoden, die Set-rückgebende Entsprechungen von Set.add()
y Set.addAll()
. Beachten Sie schließlich die build()
Methode, die einen Verweis auf das Set zurückgibt, das der Builder kapselt. Im Folgenden wird veranschaulicht, wie dieser Set-Builder zu verwenden ist:
class SomeChildClass extends ParentClass {
public SomeChildClass(String pStr) {
super(new StringSetBuilder().add(pStr).build());
}
}
class ParentClass {
public ParentClass(Set<String> pSet) {
super(new StringSetBuilder().addAll(pSet).add("my own str").build());
}
}
Kombinierte Antwort durch Michael Berdyshev mit Generics und Verwendung des Konstruktors mit initialCapacity, Vergleich mit Arrays.asList
Variante:
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@SafeVarargs
public static <T> Set<T> buildSetModif(final T... values) {
final Set<T> modifiableSet = new HashSet<T>(values.length);
Collections.addAll(modifiableSet, values);
return modifiableSet;
}
@SafeVarargs
public static <T> Set<T> buildSetModifTypeSafe(final T... values) {
return new HashSet<T>(Arrays.asList(values));
}
@SafeVarargs
public static <T> Set<T> buildeSetUnmodif(final T... values) {
return Collections.unmodifiableSet(buildSetModifTypeSafe(values));
// Or use Set.of("a", "b", "c") if you use Java 9
}
buildSetModif
wird das resultierende T ist ? extends Object
was wahrscheinlich nicht das ist, was Sie wollen, kann dies nicht mit dem buildSetModifTypeSafe
Variante, was bedeutet, dass buildSetModifTypeSafe(1, 2, "a");
wird nicht kompiliert 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.