java8中stream流如何取最大值、最小值

java8中的stream流在操作集合对象时非常好用,一些常用的用法可以参考java8中stream流的使用教程及演示样例

本文主要讨论下如何在stream流中如何取最大值、最小值。其实很简单,直接在流中使用max或min方法即可,入参为一个实现了Comparator接口的类,常用的数据类型可以直接使用Comparator.comparing的各种方法即可。

有一个问题是:当最大值或最小值存在多个相同的对象时,函数的结果是什么呢?
经过测试可以得出,无论是max还是min,默认都是取的流中第一次出现的值,也就是遍历顺序中的第一个值。(即使是一个无序集合如set,在流中他都是有一定顺序的,只是这个顺序不是特定的,未知的一个顺序。)

完整的一个测试代码:

public class Test {

    public static void main(String[] args) {
        //获取数据
        List<User> list = getList();
        printList(list);

        //最大
        Optional<User> max = list.stream()
                .max(Comparator.comparing(User::getAge));
        max.ifPresent(user -> System.out.println("年龄最大的数据为" + user));
        //最小
        Optional<User> min = list.stream()
                .min(Comparator.comparing(User::getAge));
        min.ifPresent(user -> System.out.println("年龄最小的数据为" + user));
        printList(list);

        //测试无序set的情况
        System.out.println("测试无序set的情况");
        Set<User> set = new HashSet<>(list);
        //最大
        max = set.stream()
                .max(Comparator.comparing(User::getAge));
        max.ifPresent(user -> System.out.println("年龄最大的数据为" + user));
        //最小
        min = set.stream()
                .min(Comparator.comparing(User::getAge));
        min.ifPresent(user -> System.out.println("年龄最小的数据为" + user));
        printList(set);
    }

    private static List<User> getList() {
        return Arrays.asList(
                new User("小赵",20),
                new User("小钱",9),
                new User("小孙",18),
                new User("小李",13),
                new User("小周",20),
                new User("小吴",9)
        );
    }

    private static void printList(Collection list){
        list.forEach(System.out::println);
        System.out.println("==============\n");
    }

}

@Data
@ToString
@AllArgsConstructor
class User{

    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

}


觉得内容还不错?打赏个钢镚鼓励鼓励!!👍