sammeln Ich bekomme "Inkompatible Typen, erforderlich: CopyOnWriteArrayList, gefunden: Object" mit den folgenden. Ich verwende IntelliJ 2016.1.1.Wie man einen Stream in eine CopyOnWriteArrayList
Antwort
Es scheint, dass Ihre Felder Objekt nicht vom Typ Foo ist, sonst sollte es Arbeit finden unten arbeiten Code.
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
public class Foo {
private String name;
Foo(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Foo [name=" + name + "]";
}
public static void main(String[] args) {
List<Foo> fields = new ArrayList<>();
fields.add(new Foo("aa"));
fields.add(new Foo("bb"));
CopyOnWriteArrayList<Foo> l = fields.stream().distinct().collect(Collectors.toCollection(CopyOnWriteArrayList::new));
System.out.println("l"+l);
}
}
PS: Wenn Ihre Felder dann diese geben Fehler wird auch allgemeine Nicht ist
Das Problem ist, dass fields
eine unangemessene Art hat höchstwahrscheinlich eine rohe Art hat, die die verwandeln Generische Aufrufe der Stream-Kette in ungeprüfte Operationen, die ihren gelöschten Typ zurückgeben, der Object
für den Terminal-Aufruf collect
lautet.
die richtige Art verwenden, funktioniert dies ohne Probleme, das heißt
List<String> fields=Arrays.asList("foo", "bar", "baz", "foo");
CopyOnWriteArrayList<String> l =
fields.stream()
.distinct()
.collect(Collectors.toCollection(CopyOnWriteArrayList::new));
funktioniert. Beachten Sie aber, dass das Erstellen einer CopyOnWriteArrayList
auf diese Weise ziemlich teuer ist, wie der Name "copy on write" bereits andeutet. Das Kopieren des gesamten Inhalts bei jeder Einfügung führt zu einer quadratischen Zeitkomplexität.
Die Lösung besteht darin, in einer temporären Sammlung zu sammeln, die besser für inkrementelles Bauen geeignet ist, bevor sie in den gewünschten Zieltyp konvertiert wird. Dieser Kopierschritt könnte wie Overhead aussehen, aber es ist linear Overhead, verglichen mit der quadratischen Komplexität des Sammelns direkt in die CopyOnWriteArrayList
.
CopyOnWriteArrayList<String> l =
fields.stream()
.distinct()
.collect(Collectors.collectingAndThen(
Collectors.toList(), CopyOnWriteArrayList::new));
Beachten Sie, dass in diesem speziellen Fall, baut distinct
implizit eine Set
hinter den Kulissen, so können wir die Leistung durch den Bau der Set
explizit anstelle des temporären List
und entfernen Sie den distinct
Schritt verbessern:
CopyOnWriteArrayList<String> l =
fields.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(LinkedHashSet::new),
CopyOnWriteArrayList::new));
was zu der Schlussfolgerung führt, dass wir für diesen spezifischen Anwendungsfall alles einfacher und potentiell noch effizienter haben können:
CopyOnWriteArrayList<String> l = new CopyOnWriteArrayList<>(new LinkedHashSet<>(fields));
- 1. Wie man einen Java-Stream in einen Scala-Stream konvertiert
- 2. Wie sperrt man einen Stream?
- 3. Wie konvertiert man System.Data.Linq.Binary in einen Stream?
- 4. Warum CopyOnWriteArrayList Serialisierung anpassen muss
- 5. Wie zeichnet man einen RTMP-Stream auf?
- 6. Wie man einen Stream mit highland.js ausgibt?
- 7. Wie implementiert man einen Java-Stream?
- 8. Wie macht man einen Gleitpuffer-Stream?
- 9. Einen Stream in eine RCDATA-Ressource schreiben
- 10. Behavior of CopyOnWriteArrayList
- 11. Warum ist CopyOnWriteArrayList sicher?
- 12. Wie wandelt man einen Highland-Stream in einen lesbaren Stream um?
- 13. Java: CopyOnWriteArrayList vs synchronisierte Liste
- 14. CopyOnWriteArrayList synchronisierte Methoden
- 15. Wie man einen `Stream` in imperative Leseoperationen umwandelt
- 16. einen Byte-Stream in eine Java-Klasse
- 17. Wie man ein DateTimeOffset in einen binären Stream serialisiert
- 18. Wie konvertiere ich eine for-Schleife in einen Stream
- 19. Wie erstellt man einen leeren Stream in Gulp?
- 20. Wie konvertiert man einen Java 8 Stream in ein Array?
- 21. Wie erhöht man einen Wert in Java Stream?
- 22. Konvertiere einen Stream in eine Liste
- 23. Wie lade ich eine Webseite in einen Stream in. NET
- 24. Callbacks in einen Stream umwandeln
- 25. Wie liest man den gesamten Stream in eine std :: string?
- 26. Wie speichere ich einen Tweepy-Twitter-Stream in eine Datei?
- 27. Wie kann ich eine Java Enumeration in einen Stream umwandeln?
- 28. Wie liest man einen MIME-kodierten Stream richtig?
- 29. Wie man einen Stream aus einem DirectoryStream macht
- 30. Wie schreibe ich in einen Duplex-Stream?
Tipp: Vielleicht brauchst du irgendwo einen Typhint, wie 'Collections '. toCollection() 'oder so ähnlich. Und jetzt die Idee, warum das abgelehnt wurde. Hat meinen Teil, um es zu beheben. –
GhostCat
Wird nicht helfen. Hier sind einige weitere Charaktere. – Seppo420
Kannst du plz setzen, was deine Felder variabel sind? –