यह वह जगह है जहाँ collectingAndThen
कलेक्टर उपयोगी है:
List<Integer> list = IntStream.range(0, 7).boxed()
.collect(collectingAndThen(toList(), ImmutableList::copyOf));
यह List
आपके द्वारा निर्मित परिवर्तन पर लागू होता है ; परिणामस्वरूप ImmutableList
।
या आप अंत में सीधे एकत्रित कर सकते हैं Builder
और कॉल कर सकते हैं build()
:
List<Integer> list = IntStream.range(0, 7)
.collect(Builder<Integer>::new, Builder<Integer>::add, (builder1, builder2) -> builder1.addAll(builder2.build()))
.build();
यदि यह विकल्प आपके लिए थोड़ा-सा है और आप इसे कई जगहों पर उपयोग करना चाहते हैं, तो आप अपना खुद का कलेक्टर बना सकते हैं:
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();
}
}
और फिर:
List<Integer> list = IntStream.range(0, 7)
.boxed()
.collect(new ImmutableListCollector<>());
यदि टिप्पणी में लिंक गायब हो जाता है; मेरे दूसरे दृष्टिकोण को एक स्थिर उपयोगिता विधि में परिभाषित किया जा सकता है जो बस उपयोग करता है Collector.of
। यह आपकी अपनी Collector
कक्षा बनाने की तुलना में सरल है ।
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);
}
और उपयोग:
List<Integer> list = IntStream.range(0, 7)
.boxed()
.collect(toImmutableList());