Java8自定义条件让集合分组

Posted 飞叶子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>>();
        }
    }

 

以上是关于Java8自定义条件让集合分组的主要内容,如果未能解决你的问题,请参考以下文章

java8 stream自定义分组求和并排序

在PowerQuery中让用户自定义筛选条件的一种解决办法

SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段

Java8 Streams 让集合操作飞起来

片段的条件自定义 OnBackPress

java8 stream对数组按条件进行分组