JAVA新特性(6)自定义收集器的实现与Collectors类

  1. 实现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));
        }
    }



     
  2. 并行流:可以有多个线程,每一个线程操作一个对应的结果容器;如果设置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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值