Gibt es einen Sammler, der zu einem auftragserhaltenden Set sammelt?

107

Collectors.toSet()bewahrt nicht die Ordnung. Ich könnte stattdessen Listen verwenden, möchte aber darauf hinweisen, dass die resultierende Auflistung keine Elementduplizierung zulässt. Genau dafür ist die SetSchnittstelle gedacht.

gvlasov
quelle
Ich glaube nicht, dass so etwas existiert. Ich weiß, ich brauchte auch einen und musste meinen eigenen schreiben.
Markspace
Würde SortedSetfunktionieren? Wenn nicht, ist Custom der richtige Weg.
AntonH
@AntonH Nein, ich würde O (1) -Operationen O (log n) vorziehen.
Gvlasov
1
Ich habe diesen Code gepostet, er ist nicht genau das, was Sie brauchen, aber er könnte Ihnen den Einstieg erleichtern.
Markspace

Antworten:

203

Sie können toCollectiondie konkrete Instanz des gewünschten Satzes verwenden und bereitstellen. Zum Beispiel, wenn Sie die Einfügereihenfolge beibehalten möchten:

Set<MyClass> set = myStream.collect(Collectors.toCollection(LinkedHashSet::new));

Beispielsweise:

public class Test {    
    public static final void main(String[] args) {
        List<String> list = Arrays.asList("b", "c", "a");

        Set<String> linkedSet = 
            list.stream().collect(Collectors.toCollection(LinkedHashSet::new));

        Set<String> collectorToSet = 
            list.stream().collect(Collectors.toSet());

        System.out.println(linkedSet); //[b, c, a]
        System.out.println(collectorToSet); //[a, b, c]
    }
}
Alexis C.
quelle
Schön, genau das brauche ich, aber ich denke, Guavas ImmutableSetwäre in meinem Fall noch besser. Irgendwelche Ideen, wie ich einen Sammler machen kann, der sammelt ImmutableSet? Seine Instanzen werden mit einem erstellt, ImmutableSet.Builderdas kein a ist Collection, daher kann ich nicht herausfinden, wie Sie in diesem Fall ein Supplierfor erstellen würden Collectors.toCollection().
Gvlasov
@ Susei Ich werde versuchen, es zu untersuchen. Eine Alternative wäre die Rückgabe eines nicht veränderbaren Satzes. Beispiel:Set<String> linkedSet = list.stream().collect(Collectors.toCollection(LinkedHashSet::new)); linkedSet = Collections.unmodifiableSet(linkedSet);
Alexis C.
@ Susei Das nächste, das ich gefunden habe: Ich bin mir Set<String> set = list.stream().collect( ImmutableSet.Builder<String>::new, ImmutableSet.Builder<String>::add, (builder1, builder2) -> builder1.addAll(builder2.build())).build();nicht sicher, ob es ein besserer Ansatz ist, indem ich das resultierende Set mit umhülle Collections.unmodifiableSet.
Alexis C.
Hier ist eine spezielle Frage, da dies bereits nicht zum Thema gehört (und für weitere Wiederholungen
gvlasov