java8中的stream流在操作集合对象时非常好用,一些常用的用法可以参考java8中stream流的使用教程及演示样例
本文主要讨论下如何在stream流中如何取最大值、最小值。其实很简单,直接在流中使用max或min方法即可,入参为一个实现了Comparator接口的类,常用的数据类型可以直接使用Comparator.comparing的各种方法即可。
贝医生防蛀牙膏健齿防龋亮白护龈含氟牙膏正畸人群可用清新薄荷牙膏100g¥9.90
有一个问题是:当最大值或最小值存在多个相同的对象时,函数的结果是什么呢?
经过测试可以得出,无论是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;
}