Java8新特性,List分组排序

本文详细介绍了Java8中List的分组与排序操作,包括多字段分组、升序和降序排序,以及如何处理分组时遇到的null值问题。同时,展示了如何通过filter方法进行条件过滤。对于分组时遇到的null值异常,解决方案是使用Optional包裹分组字段,避免空指针异常。
摘要由CSDN通过智能技术生成

Java8新特性,List分组排序

1.分组(多字段分组)

Map<String,List<Fruit>> fruitMap = fruitList.stream().collect(Collectors.groupingBy(Fruit::getName));
Map<String, List<CalbPrOutputSum>> map = outputSums.stream().collect(Collectors.groupingBy(t -> t.getModelNum()));
Map<String, List<WorkPlanVo>> collect = value.stream().collect(Collectors.groupingBy(a -> MessageFormat.format("{0}#{1}#{2}#{3}#{4}", a.getWorkshop(),
        a.getProjectCode(), a.getProdLineCode(), a.getModelCode(), a.getOutputOp())));

2.使用年龄进行升序排序

List<StudentInfo> studentsSortName = studentList.stream().sorted(Comparator.comparing(StudentInfo::getAge)).collect(Collectors.toList());

3.使用年龄进行降序排序(使用reversed()方法):

List<StudentInfo> studentsSortName = studentList.stream().sorted(Comparator.comparing(StudentInfo::getAge).reversed()).collect(Collectors.toList());

4. 使用年龄进行降序排序,年龄相同再使用身高升序排序

List<StudentInfo> studentsSortName = studentList.stream()
                .sorted(Comparator.comparing(StudentInfo::getAge).reversed().thenComparing(StudentInfo::getHeight))
                .collect(Collectors.toList());

5.过滤

List<Employee> employees = new ArrayList<Employee>();
employees.addAll(Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10));
Optional<Employee> first = employees.stream().filter(t -> "M".equals(t.getGender())).findFirst();
List<Employee> collect = employees.stream().filter(t -> "M".equals(t.getGender())).collect(Collectors.toList());
List<Employee> collect1 = employees.stream().filter(t -> "M".equals(t.getGender())).filter(t -> "Ricky".equals(t.getFirstName())).collect(Collectors.toList());

5.在使用Collectors.groupingBy分组时,如果分组的字段中有值为null,会抛出空指针异常
example:

class Stu{
    String age;
    String sex;
    public Stu(String age, String sex) {
        this.age = age;
        this.sex = sex;
    }
}

@Test
void test1(){
    List<Stu> objects = new ArrayList<>();
    objects = Arrays.asList(new Stu("18",null),new Stu("19","男"),new Stu("17","女"));
    Map<String, List<Stu>> collect = objects.stream().collect(Collectors.groupingBy(x -> x.getSex()));
    System.out.println(collect);
}

输出:java.lang.NullPointerException: element cannot be mapped to a null key

解决办法:

@Test
void test1(){
    List<Stu> objects = new ArrayList<>();
    objects = Arrays.asList(new Stu("18",null),new Stu("19","男"),new Stu("17","女"));
    Map<Optional<String>, List<Stu>> collect = objects.stream().collect(Collectors.groupingBy(x -> Optional.ofNullable(x.getSex())));
    System.out.println(collect);
    ArrayList<Stu> finalList = new ArrayList<Stu>();
    for (Map.Entry<Optional<String>, List<Stu>> optionalListEntry : collect.entrySet()) {
        //Optional<String> key = optionalListEntry.getKey();
        //key.isPresent()//分组的键不为空
        if (optionalListEntry.getKey().isPresent()){
            finalList.addAll(optionalListEntry.getValue());
        }
    }
    System.out.println(finalList);
}
输出:
{Optional.empty=[Stu{age='18', sex='null'}], Optional[]=[Stu{age='17', sex='女'}], Optional[]=[Stu{age='19', sex='男'}]}
[Stu{age='17', sex='女'}, Stu{age='19', sex='男'}]

https://www.cnblogs.com/codecat/p/10873757.html

Java 8中,可以使用Stream流来将List分组。有两种方式可以实现单字段分组和多字段分组。 单字段分组可以使用groupingBy方法,按照name属性进行分组。你可以使用stream流来实现这个操作,具体代码如下所示: Map<String, List<Map<String, Object>>> listMap = groupList.stream() .collect(Collectors.groupingBy(item -> item.get("name").toString())); 多字段分组可以使用groupingBy方法,按照name和age属性进行分组。你可以使用stream流来实现这个操作,具体代码如下所示: Map<String, List<Map<String, Object>>> listMap = groupList.stream() .collect(Collectors.groupingBy(item -> item.get("name").toString() + "|" + item.get("age"))); 另外,如果你想对用户列表按照年龄进行排序,可以使用sorted方法。具体代码如下所示: List<User> userList = UserService.getUserList(); userList = userList.stream() .sorted((u1, u2) -> u1.getAge() - u2.getAge()) .collect(Collectors.toList()); 这样就可以按照年龄升序排序用户列表了。你也可以使用Comparator.comparingInt方法来简化代码: userList = userList.stream() .sorted(Comparator.comparingInt(User::getAge)) .collect(Collectors.toList()); 如果你想按照降序排序,可以使用reversed方法: userList = userList.stream() .sorted(Comparator.comparingInt(User::getAge).reversed()) .collect(Collectors.toList()); 这样就可以按照年龄降序排序用户列表了。希望对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Java8使用stream流给List,Object>>分组(多字段key)](https://blog.csdn.net/weixin_43920527/article/details/129820467)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Java8特性Stream流对List列表实现查询、统计、排序分组](https://blog.csdn.net/xnian_/article/details/129985585)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值