- 实现Collector接口,首先在类中实现接口中所有的抽象方法,然后在主程序中用collect传入实现的类的实例
public class CollectorSetTest<T> implements Collector<T,Set<T>,Set<T>> { //简单自定义收集器的实现:将list结果收集到一个Set中 public static void main(String[] args) { List<String> list = Arrays.asList("Hello","World","NiHao"); Set<String> strings = list.stream().collect(new CollectorSetTest<String>()); System.out.println(strings); } @Override public Supplier<Set<T>> supplier() { System.out.println("supplier invoked"); return HashSet::new; } @Override public BiConsumer<Set<T>,T> accumulator() { System.out.println("accumulator invoked"); //报错,要使用给定泛型的Set,不能使用具体实现类 // return HashSet<T>::add;//不行 // return Set<T>::add;//可以 return (set,item)->set.add(item);//与上等价 } @Override public BinaryOperator<Set<T>> combiner() { System.out.println("combiner invoked"); return (set1,set2)->{set1.addAll(set2); return set1;}; } @Override public Function<Set<T>,Set<T>> finisher() { System.out.println("finisher invoked"); // return set->set; return Function.identity(); } @Override public Set<Characteristics> characteristics() { System.out.println("characteristics invoked"); return Collections.unmodifiableSet(EnumSet.of (Characteristics.IDENTITY_FINISH,Characteristics.UNORDERED)); } }
- 并行流:可以有多个线程,每一个线程操作一个对应的结果容器;如果设置Collector的属性Characteristics.Concurrent,则多个线程会操作仅仅一个结果容器。
示例代码:public class CollectorSetTest2<T> implements Collector<T, Set<T>,Map<T,T>> { // 实现:输入:Set<String> 输出:Map<String,String> public static void main(String[] args) { List<String> list = Arrays.asList("Hello","World","NiHao","Beijing","Hello","a","b","c","d","e"); Set<String> strings = new TreeSet<>(); strings.addAll(list); System.out.println(strings); System.out.println(Runtime.getRuntime().availableProcessors());//打印线程数 // para
JAVA新特性(6)自定义收集器的实现与Collectors类
最新推荐文章于 2023-06-25 21:55:14 发布