美文网首页
java8 max/min取到值为空, 或者取不到最大最小值

java8 max/min取到值为空, 或者取不到最大最小值

作者: 饱饱想要灵感 | 来源:发表于2022-08-03 16:01 被阅读0次

    提问1: max()min()总能取到最大最小值吗?

    不能, 这取决于集合是如何排序的, max()的含义是取出的是最后一个, 而min()的含义是取出第一个, 不一定是最大最小值



    提问2: 如下代码, 若要取出userList中最大的年龄即19, 那么4个选项中哪些是正确的?

        @Test
        public void streamTest() {
            User user_1 = new User("饱饱", 18);
            User user_2 = new User("爆爆", 19);
            User user_3 = new User("包包");
            List<User> userList = Lists.newArrayList(user_1, user_2, user_3);
    
            // 选项1
           userList.stream().max(Comparator.comparing(User::getAge)).ifPresent(
                   item -> System.out.println(item.getAge())
           );
    
            // 选项2
            userList.stream().max(Comparator.comparing(User::getAge, Comparator.nullsLast(Comparator.naturalOrder()))).ifPresent(
                    item -> System.out.println(item.getAge())
            );
    
            // 选项3
            userList.stream().max(Comparator.comparing(User::getAge, Comparator.nullsFirst(Comparator.naturalOrder()))).ifPresent(
                    item -> System.out.println(item.getAge())
            );
    
            // 选项4
           userList.stream().map(User::getAge).filter(ObjectUtil::isNotNull)
               .max(Comparator.naturalOrder()).ifPresent(System.out::println);
        }
    

    思考之后, 往下滚动查看答案~
















    解析:

    • 选项1, 错误, 所有age属性都不为空时正常执行,一旦age有空值就会报错
    userList.stream().max(Comparator.comparing(User::getAge)).ifPresent(item -> System.out.println(item.getAge()));
    
    • 选项2, 错误, 把userListage排序, 把age为空的放到最后面, max是取出最后一个值, 因此结果反而是null
            userList.stream().max(Comparator.comparing(User::getAge, Comparator.nullsLast(Comparator.naturalOrder()))).ifPresent(
                    item -> System.out.println(item.getAge())
            );
    
    • 选项3, 正确, 把userListage排序, 把age为空的放到最前面, max是取出最后一个值, 因此结果正确
          userList.stream().max(Comparator.comparing(User::getAge, Comparator.nullsFirst(Comparator.naturalOrder()))).ifPresent(
                    item -> System.out.println(item.getAge())
            );```
      
    • 选项4, 正确, 最直白的写法, 过滤掉空age一了百了, 不用顾虑nullsLast或者nullsFirst
    userList.stream().map(User::getAge).filter(ObjectUtil::isNotNull).max(Comparator.naturalOrder()).ifPresent(
                    System.out::println
            );
    



    结论:

    1. max应配合nullsFirst 使用, min应配合nullsLast使用
    2. 使用maxmin之前, 先map().filter(ObjectUtil::isNotNull)过滤掉空值, 这样来得直截了当, 还不易出错

    相关文章

      网友评论

          本文标题:java8 max/min取到值为空, 或者取不到最大最小值

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