美文网首页
java stream groupingby分组后排序重构val

java stream groupingby分组后排序重构val

作者: 黑暗中冬眠的华仔 | 来源:发表于2020-11-10 15:06 被阅读0次

    java8 stream中使用分组排序 分组获取最大、最小值;

    实体类中 list列表中分组排序

    实体类

    @Data
    @Accessors(chain = true)
    public class Users {
        private Integer age;
        private String name;
        private Integer sex;
    }
    

    分组后排序

     Map<String, List<Users>> sortUsers = objects.stream()
                    .collect(Collectors.groupingBy(Users::getName, CommonUtils.toSortedList(
                            Comparator.comparing(Users::getAge)
                                    .reversed())));
    //收集器
    public static <T> Collector<T, ?, List<T>> toSortedList(Comparator<? super T> c) {
            return Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(c)), ArrayList::new);
        }
    

    分组后获取最大、最小实体

    Map<String, Users> sortUsersMax = objects.stream()
                    .collect(Collectors.groupingBy(Users::getName,                    CommonUtils.toSorted(Comparator.comparing(Users::getAge))));
    
    //收集器 如果获取最小值  Collectors.maxBy(c) -》 Collectors.minBy(c)
    
    public static <T> Collector<T, ?, T> toSorted(Comparator<? super T> c) {
            Collector<T, ?, T> usersObjectUsersCollector = Collectors.collectingAndThen(Collectors.maxBy(c), Optional::get);
            return usersObjectUsersCollector;
        }
    
    

    重构分组key 以及value

    //获取省市映射关系
            Map<String, List<String>> pCityDataMap = cityValues.stream()
                                                                   .collect(Collectors.groupingBy(k ->
                                                                                   Optional.ofNullable(pCodeName.get(k.getPCode()))
                                                                                           .orElse(Integer.toString(-1)),
                                                                           Collectors.mapping(CityDto::getName,
                                                                                   Collectors.toList())));
            //获取市区映射关系
            Map<String, List<String>> cAreaDataMap = areaValues.stream()
                                                               .collect(Collectors.groupingBy(k -> Optional.ofNullable(cCodeName.get(k.getCCode()))
                                                                                                           .orElse(Integer.toString(-1)),
                                                                       Collectors.mapping(AreaDto::getName,
                                                                               Collectors.toList())));
    
    

    相关文章

      网友评论

          本文标题:java stream groupingby分组后排序重构val

          本文链接:https://www.haomeiwen.com/subject/gmrjbktx.html