Java8自定义条件让集合分组

2018-11-06 06:52:09来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

    /**
     * 将一个指定类型对象的集合按照自定义的一个操作分组; 每组对应一个List、最终返回结果类型是:List<List<T>>
     *
     * @param <T>
     */
    static class GroupToList<T> implements Collector<T, List<List<T>>, List<List<T>>> {
        /**
         * 集合中对象两两比较,满足自定义的条件(operation结果返回true),便将这两个元素分为一组
         */
        private BiFunction<T, T, Boolean> operation;
        
        
        public GroupToList(BiFunction<T, T, Boolean> operation) {
            super();
            this.operation = operation;
        }

        @Override
        public BiConsumer<List<List<T>>, T> accumulator() {
            return (c, t) -> {
                boolean added = false;
                for (List<T> cc : c) {
                    for (T ccc : cc) {
                        if (operation.apply(ccc, t)){
                            cc.add(t);
                            added = true;
                        }
                        break;
                    }
                    if (added)
                        break;
                    continue;
                }
                if (!added) {
                    ArrayList<T> list = new ArrayList<T>();
                    list.add(t);
                    c.add(list);
                }
            };
        }

        @Override
        public Set<java.util.stream.Collector.Characteristics> characteristics() {
            /*
            Set<java.util.stream.Collector.Characteristics> emptySet = Collections.emptySet();
            */
            return Collections.unmodifiableSet(EnumSet.of(Characteristics.IDENTITY_FINISH));
        }

        @Override
        public BinaryOperator<List<List<T>>> combiner() {
            return (l1,l2) -> {l2.addAll(l1); return l2;};
        }

        @Override
        public Function<List<List<T>>, List<List<T>>> finisher() {
            return p -> p;
        }

        @Override
        public Supplier<List<List<T>>> supplier() {
            return () -> new ArrayList<List<T>>();
        }
    }

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:浅显易懂的Sysnchronizd用法

下一篇:freemarker根据模板生成word文件实现导出功能