欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java8自定义条件让集合分组

程序员文章站 2024-02-01 21:07:46
/** * 将一个指定类型对象的集合按照自定义的一个操作分组; 每组对应一个List、最终返回结果类型是:List> * * @param */ static class GroupToList implements Collector>, List>> { /** * 集合中对象两两比较,满足自定... ......
    /**
     * 将一个指定类型对象的集合按照自定义的一个操作分组; 每组对应一个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>>();
        }
    }