Java8自定义条件让集合分组

    /**
     * 将一个指定类型对象的集合按照自定义的一个操作分组; 每组对应一个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>>();
        }
    }

 

posted @ 2018-11-06 11:34  飞叶子  阅读(3680)  评论(0编辑  收藏  举报