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

2022-08-03  本文已影响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);
    }

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
















解析:

userList.stream().max(Comparator.comparing(User::getAge)).ifPresent(item -> System.out.println(item.getAge()));
        userList.stream().max(Comparator.comparing(User::getAge, Comparator.nullsLast(Comparator.naturalOrder()))).ifPresent(
                item -> System.out.println(item.getAge())
        );
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)过滤掉空值, 这样来得直截了当, 还不易出错
上一篇 下一篇

猜你喜欢

热点阅读