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>>();
        }
    }

原文地址:https://www.cnblogs.com/mleaf/p/9914336.html

时间: 2024-08-28 06:50:13

Java8自定义条件让集合分组的相关文章

Java8 新特性之集合操作Stream

Java8 新特性之集合操作Stream Stream简介 Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同. stream是对集合对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作,或者大批量数据操作. 为什么要使用Stream 函数式编程带来的好处尤为明显.这种代码更多地表达了业务逻辑的意图,而不是它的实现机制.易读的代码也易于维护.更可靠.更不容易出错. 高端 使用实例: 测试数据:

java编程排序之自定义类型的集合,按业务需求排序

自定义引用类型放入集合中,按实际业务需求进行排序的两种思路 第一种思路: (1)自定义实体类实现java.lang.Comparable接口,重写public int compareTo(Object obj)方法.自定义业务比较规则 (2)利用java.util.Collections类的静态方法sort(List<自定义类型> list)进行排序(默认升序)或者.自己编写排序工具类.冒泡+compareTo(obj)方法 第二种思路 (1)自己编写业务比较规则类.实体类不用实现任何借口.业

List 多条件,多条件筛选集合

public List<DeviceStatePojoVo> getState(int deviceType, String precinctId, String deviceName, String onLine) { List<CfgDevice> deviceList = cfgDeviceMapper.findAllDevice();//查所有 StringBuffer s = new StringBuffer(); Map<String, CfgDevice>

java8 list数据过滤,分组

传统方式:ListUtil.java public class ListUtil{ private static Logger LOGGER=LoggerFactory.getLogger(ListUtil.class); /** * 分组依据接口,用于集合分组时,获取分组 * T为要groupBy属性是类型,这个返回值为要groupBy的属性值 */ public interface GroupBy<T> { T groupBy(Object obj) ; } /** * 通过属性对集合分组

List集合分组实现教程

封装一个方法,用一个Map来实现,这里是根据bean类的seq字段进行拆分的,分成好几个list private LinkedHashMap<String,List<HandleInfo>> groupListBySeq(List<HandleInfo> list) { LinkedHashMap<String,List<HandleInfo>> map = new LinkedHashMap<String,List<HandleIn

自定义条件查询测试

1 //自定义条件查询测试 2 @Test 3 public void testFindAllByExample() { 4 //分页参数 5 int page = 0;//从0开始 6 int size = 10; 7 /* 8 //分页参数 9 if (page <= 0) { 10 page = 1; 11 } 12 if (size <= 0) { 13 size = 10; 14 } 15 //构造分页查询方法 16 page = page - 1; 17 */ 18 Pageabl

SAP MM 自定义条件类型出现在采购信息记录的&#39;条件&#39;界面里 ?

SAP MM 自定义条件类型出现在采购信息记录的'条件'界面里 ? 我在SAP系统里复制某个标准的采购条件类型,创建了一个新的自定义条件类型ZC05,并将其分配采购定价过程RM0000. 结果却出现一个怪现象:在ME11/ME12/ME13去维护采购信息记录的时候,当点击'条件'按钮后,该条件类型与条件类型PB00一起出现在一个小窗口里,如下图: 类似的界面也出现在合同单据里,当我们选中某个ITEM去看条件数据的时候. 为啥会这样?这可是头一回遇到!经过研究与调查,找到了原因与解决办法. 解决办

java8 新特性 Stream流 分组 排序 过滤 多条件去重

private static List<User> list = new ArrayList<User>(); public static void main(String[] args) { list = Arrays.asList( new User(1, "a", 10), new User(4, "d", 19), new User(5, "e", 13), new User(2, "b", 1

集合分组

一,List分组 // 1.java8之前 // 按照Name分组,准备Map,此处使用LinkedHashMap的原因是为了保证后续遍历的时候,按照分组时的add顺序来操作 Map<String,List<Vo>> groupMap = new LinkedHashMap<String,List<Vo>>(); for(Vo groupVo : dataList) { String groupName = groupVo.getGroupName(); /