Ich möchte Folgendes tun:
List<Integer> list = IntStream.range(0, 7).collect(Collectors.toList());
aber in einer Weise, dass die resultierende Liste eine Implementierung von Guava ist ImmutableList
.
Ich weiß, ich könnte es tun
List<Integer> list = IntStream.range(0, 7).collect(Collectors.toList());
List<Integer> immutableList = ImmutableList.copyOf(list);
aber ich möchte es direkt sammeln. ich habe es versucht
List<Integer> list = IntStream.range(0, 7)
.collect(Collectors.toCollection(ImmutableList::of));
aber es warf eine Ausnahme:
java.lang.UnsupportedOperationException unter com.google.common.collect.ImmutableCollection.add (ImmutableCollection.java:96)
java-8
guava
java-stream
Zoltán
quelle
quelle
@Beta
ab Guave 26.0.Hier ist der
collectingAndThen
Sammler nützlich:Es wendet die Transformation auf das an, was
List
Sie gerade gebaut haben. was zu einemImmutableList
.Oder Sie können direkt in die sammeln
Builder
undbuild()
am Ende anrufen :Wenn diese Option für Sie etwas ausführlich ist und Sie sie an vielen Stellen verwenden möchten, können Sie Ihren eigenen Sammler erstellen:
und dann:
Nur für den Fall, dass der Link in den Kommentaren verschwindet; Mein zweiter Ansatz könnte in einer statischen Dienstprogrammmethode definiert werden, die einfach verwendet
Collector.of
. Es ist einfacher als eine eigeneCollector
Klasse zu erstellen .und die Verwendung:
quelle
ImmutableList.Builder
hilfreich sein?build()
.Collector
Klasse zu definieren :-)ImmutableList<Integer>
(anstelle vonList<Integer>
) sein.Dies ist zwar keine direkte Antwort auf meine Frage (es werden keine Sammler verwendet), aber dies ist ein ziemlich eleganter Ansatz, bei dem keine Zwischensammlungen verwendet werden:
Quelle .
quelle
Übrigens: seit JDK 10 kann es in reinem Java gemacht werden:
Auch
toUnmodifiableSet
undtoUnmodifiableMap
verfügbar.Innerhalb des Sammlers wurde es über gemacht
List.of(list.toArray())
quelle
ImmutableCollections.List12
undImmutableCollections.ListN
! = GuavasImmutableList
. Aus praktischer Sicht haben Sie größtenteils Recht, aber es wäre dennoch sinnvoll, diese Nuance in Ihrer Antwort zu erwähnen.Zu Ihrer Information, es gibt einen vernünftigen Weg, dies in Guava ohne Java 8 zu tun:
Wenn Sie die
List
Semantik nicht wirklich brauchen und einfach eine verwenden könnenNavigableSet
können, ist dies sogar noch besser, da aContiguousSet
nicht alle Elemente darin speichern muss (nur dasRange
undDiscreteDomain
).quelle