Đây là nơi mà collectingAndThenbộ sưu tập hữu ích:
List<Integer> list = IntStream.range(0, 7).boxed()
.collect(collectingAndThen(toList(), ImmutableList::copyOf));
Nó áp dụng chuyển đổi cho Listbạn vừa xây dựng; dẫn đến một ImmutableList.
Hoặc bạn có thể thu thập trực tiếp vào Buildervà gọi build()ở cuối:
List<Integer> list = IntStream.range(0, 7)
.collect(Builder<Integer>::new, Builder<Integer>::add, (builder1, builder2) -> builder1.addAll(builder2.build()))
.build();
Nếu tùy chọn này hơi dài dòng đối với bạn và bạn muốn sử dụng nó ở nhiều nơi, bạn có thể tạo bộ sưu tập của riêng mình:
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();
}
}
và sau đó:
List<Integer> list = IntStream.range(0, 7)
.boxed()
.collect(new ImmutableListCollector<>());
Chỉ trong trường hợp liên kết biến mất trong các nhận xét; cách tiếp cận thứ hai của tôi có thể được xác định trong một phương thức tiện ích tĩnh sử dụng đơn giản Collector.of. Nó đơn giản hơn việc tạo Collectorlớp học của riêng bạn .
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);
}
và cách sử dụng:
List<Integer> list = IntStream.range(0, 7)
.boxed()
.collect(toImmutableList());