ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### 3.4.2 Collector接口 ```java import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Supplier; /** * @param <T> 流中收集的项目 * @param <A> 累加器,在收集过程中用于累积部分结果的对象的类型 * @param <R> 收集操作得到的对象的类型 */ public interface Collector<T, A, R> { Supplier<A> supplier(); BiConsumer<A, T> accumulator(); BinaryOperator<A> combiner(); Function<A, R> finisher(); Set<Characteristics> characteristics(); enum Characteristics { CONCURRENT, UNORDERED, IDENTITY_FINISH } } ``` 前四个方法都会返回一个被collect方法调用的函数,而`characteristics`方法则提供了一个提示列表,告诉collect方法在执行归约操作时可以应用那些优化。 ---- > 在为了提高性能的情况下,可以自行开发Collector接口的实现类。 **1. 自定义Collector接口的实现类** 下面是Collector接口的实现类: ```java import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; import java.util.List; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; /** * 自定义收集器的实现 * @author z8g * @param <E> 元素类型 */ public class ToListCollector<E> implements Collector<E, List<E>, List<E>> { /** * 操作集合的起始点 * * @return */ @Override public Supplier<List<E>> supplier() { return ArrayList::new; } /** * 累加 * * @return */ @Override public BiConsumer<List<E>, E> accumulator() { return List::add; } /** * 内容合并 * * @return */ @Override public BinaryOperator<List<E>> combiner() { return (list1, list2) -> { list1.addAll(list2); return list1; }; } /** * 恒等函数 * * @return */ @Override public Function<List<E>, List<E>> finisher() { return Function.identity(); } @Override public Set<Characteristics> characteristics() { return Collections.unmodifiableSet(EnumSet.of( Characteristics.IDENTITY_FINISH, Characteristics.CONCURRENT)); } } ``` **2. ToListCollector类使用示例** ```java import java.util.Arrays; import java.util.List; public class CollectorsTest { public static void main(String[] args) { List<String> strList = Arrays.asList("abcd","efg","hi"); List<Integer> lenList = strList.stream() .map(String::length) .collect(new ToListCollector<>()); System.out.println(lenList); // [4, 3, 2] } } ```