Đây là nơi mà các nhà sưu tập collectingAndThen
rất hữu ích:
List<Integer> list = IntStream.range(0, 7).boxed()
.collect(collectingAndThen(toList(), ImmutableList::copyOf));
Nó áp dụng việc chuyển đổi thành List
bạn vừa xây dựng; dẫn đến một số ImmutableList
.
Hoặc bạn có thể trực tiếp thu thập vào Builder
và 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 là một chút-verbose cho bạn và bạn muốn sử dụng nó ở nhiều nơi, bạn có thể tạo ra thu của riêng bạn:
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 định nghĩa trong một phương thức tiện ích tĩnh chỉ đơn giản là sử dụng Collector.of
. Nó đơn giản hơn việc tạo lớp Collector
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());
này vẫn tạo ra một danh sách trung gian, phải không? Tôi muốn tránh điều đó. Có thể 'ImmutableList.Builder' được giúp đỡ không? –
@ Zoltán Bạn có thể tích lũy các giá trị trong trình tạo trực tiếp (xem phần chỉnh sửa) và sau đó gọi 'build()'. –
Cảm ơn bạn đã trả lời chi tiết này. Dường như điều này hiện đang được giải quyết: https://github.com/google/guava/issues/1582, cũng có một ví dụ điển hình ở đây (rất giống với những gì bạn đề xuất): https://gist.github.com/ JakeWharton/9734167 –