美文网首页
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)过滤掉空值, 这样来得直截了当, 还不易出错

相关文章

  • Chip #11

    Arrays.stream().min()/max().getAsInt(); Java 8 取最大最小值 Co...

  • 2019-11-21 其他函数

    统计函数(Max、Min、Average) 最大值 MAX( ) 最小值 MIN( ) 平均分 Average( ...

  • js中数字的常用方法

    min 取最小值 max 取最大值 ceil 向上取整 floor 向下取整 round 四舍五入 abs 绝对值...

  • 17.其他函数

    一、 Max、Min、Average 1) 最大值 MAX(区域 ) 2) 最小值 MIN(区域 ) 3) 平均分...

  • Day19 函数与公式

    1.统计函数(Max、Min、Average) 最大值 MAX( ) 最小值 MIN( ) 平均分 Average...

  • 内置函数

    1.查看内置函数,进入ipython 2. 常见函数 举例: 取绝对值abs 取最大值、最小值max/min,不能...

  • 2019-11-21E战到底DAY19 17.其他函数(30个

    1.统计函数(Max、Min、Average) 最大值MAX( )=MAX(B2:B10) 最小值MIN( )=M...

  • egg-validate 参数记录

    1.type:int max ----最大值 min ----最小值 2.type:number max ----...

  • 函数与公式

    一、统计函数(Max、Min、Average) 最大值 MAX( ) ' =MAX(B2:B10) 最小值 ...

  • OD-3:数值

    获取整形 最大最小值 Integer.MIN_VALUEInteger.MAX_VALUE Math.max() ...

网友评论

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

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