Stream 分组之后筛选出最大的数据,或多条件筛选
用到的函数解释:
// 函数解析(个人理解)
Collectors.toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction);
// 1、第一个参数:Function<? super T, ? extends K> keyMapper; 用于分组,做 Map的 key
// 2、第二个参数:Function<? super T, ? extends U> valueMapper;用于做 Map的 value(可以是对象中的某个属性,可以是对象,看自己选择)
// 3、第三个参数:BinaryOperator<U> mergeFunction; 分组之后组内有多个value, 在组内需要你取哪一个value
User 类在文章末尾
单条件筛选: Stream 分组后找出年纪最大的用户: main 方法测试一下:
public static void main(String[] args) {
// name ,age,height,sex
User user1 = new User("张三", 12, 150, 1);
User user2 = new User("李四", 13, 150, 1);
User user3 = new User("王五", 12, 140, 0);
User user4 = new User("赵六", 11, 140, 0);
// 将User对象转为List<User>
List<User> users = Arrays.asList(user1, user2, user3, user4);
/**
* key我用的是 User::getSex 性别
* () 保持stream中的对象作为value ,你用User::getName map的 value 便是 String(name)
* (a,b)-> () > () ? a : b 就是筛选出分组后年纪最大的一个 User 对象作为 value
*/
Map<Integer, User> map = users.stream().collect(
Collectors.toMap(User::getSex, Function.identity(), (a, b) -> a.getAge() > b.getAge() ? a : b)
);
for (Integer key : map.keySet()) {
System.out.println(map.get(key));
}
}
运行结果如下:
User{name='王五', age=12, height=140, sex=0}
User{name='李四', age=13, height=150, sex=1}
多条件筛选:Stream 分组后的找到年纪最大的之后再筛选出身高最高的
public static void main(String[] args) {
// name ,age,height,sex
User user1 = new User("张三", 12, 150, 1);
User user2 = new User("李四", 13, 150, 1);
User user3 = new User("王五", 12, 140, 0);
User user4 = new User("赵六", 11, 140, 0);
// 增加两个人做筛选
User user5 = new User("陆七", 12, 150, 0);
User user6 = new User("田八", 13, 160, 1);
List<User> users = Arrays.asList(user1, user2, user3, user4,user5,user6);
/**
* 筛选出男生、女生中 年纪最大、身高最高的一个
*/
Map<Integer, User> map = users.stream().collect(
Collectors.toMap(User::getSex, Function.identity(), (a, b) ->
a.getAge() > b.getAge() ?
a : a.getAge() == b.getAge() ? a.getHeight() > b.getHeight() ? a : b : b)
);
for (Integer key : map.keySet()) {
System.out.println(map.get(key));
}
}
User 类
package cn.trunch.auth.util;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @Author young
* @Time 2023/6/15
*/
public class User {
// 姓名
public String name;
// 年龄
public int age;
// 身高
public int height;
// 性别(1.男,0.女)
public int sex;
public User(String name, int age, int height, int sex) {
this.name = name;
this.age = age;
this.height = height;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", height=" + height +
", sex=" + sex +
'}';
}
}
总结
仅仅是自己记录一下自己在代码中遇到的问题,也是第一次写,有什么不好的还请打开指正,谢谢????