Hier wird der collectingAndThen
Sammler nützlich ist:
List<Integer> list = IntStream.range(0, 7).boxed()
.collect(collectingAndThen(toList(), ImmutableList::copyOf));
Sie wendet die Umwandlung auf die gerade erstellte List
an; was zu einem ImmutableList
führt.
Oder Sie könnten direkt sammeln in den Builder
und rufen build()
am Ende:
List<Integer> list = IntStream.range(0, 7)
.collect(Builder<Integer>::new, Builder<Integer>::add, (builder1, builder2) -> builder1.addAll(builder2.build()))
.build();
Wenn diese Option für Sie ein bisschen-ausführliche und Sie wollen, es zu benutzen in vielen Orten, Sie
class ImmutableListCollector<T> implements Collector<T, Builder<T>, ImmutableList<T>> {
@Override
public Supplier<Builder<T>> supplier() {
return Builder::new;
}
@Override
public BiConsumer<Builder<T>, T> accumulator() {
return (b, e) -> b.add(e);
}
@Override
public BinaryOperator<Builder<T>> combiner() {
return (b1, b2) -> b1.addAll(b2.build());
}
@Override
public Function<Builder<T>, ImmutableList<T>> finisher() {
return Builder::build;
}
@Override
public Set<Characteristics> characteristics() {
return ImmutableSet.of();
}
}
und dann: können eigene Sammler erstellen
List<Integer> list = IntStream.range(0, 7)
.boxed()
.collect(new ImmutableListCollector<>());
Nur für den Fall, dass der Link in den Kommentaren verschwindet; Mein zweiter Ansatz könnte in einer statischen Hilfsmethode definiert werden, die einfach Collector.of
verwendet. Es ist einfacher als das Erstellen einer eigenen Collector
Klasse.
public static <T> Collector<T, Builder<T>, ImmutableList<T>> toImmutableList() {
return Collector.of(Builder<T>::new, Builder<T>::add, (l, r) -> l.addAll(r.build()), Builder<T>::build);
}
und die Nutzung:
List<Integer> list = IntStream.range(0, 7)
.boxed()
.collect(toImmutableList());
schafft Dies noch eine Zwischen Liste, nicht wahr? Ich möchte das vermeiden. Könnte der 'ImmutableList.Builder' hilfreich sein? –
@ Zoltán Sie könnten die Werte im Builder direkt akkumulieren (siehe Bearbeiten) und dann 'build()' aufrufen. –
Vielen Dank für diese detaillierte Antwort. Es scheint, dass dies derzeit angesprochen wird: https://github.com/google/guava/issues/1582, hier gibt es auch ein schönes Beispiel (ähnlich wie du es vorgeschlagen hast): https://gist.github.com/ JakeWharton/9734167 –