工作中遇到一个场景短信发送的聚合场景,需要对一个企业多个账号进行短信推送,但是如果短信接受人是同一个人,那么只发一条短信即可,需要处理集合中对象存在多个相同属性聚合去重的操作,使用java8 Stream 流处理;由于使用频率不高,特此记录一下
java实例对象
/**
* @Title: UserDao
* @Description:
* @Auther:
* @Version: 1.0
* @create 2022/6/16 10:42
*/
public class UserDao {
private String id ;
private String name;
private String age ;
private String salary;
public UserDao(){
super();
}
public UserDao (String id,String name,String age,String salary){
super();
this.id = id;
this.name = name;
this.age = age;
this.salary = salary;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
@Override
public String toString(){
return id+"-"+name+"-"+age+"-"+salary;
}
}
流处理筛选逻辑
/**
* @Title: TestStream
* @Description:
* @Auther:
* @Version: 1.0
* @create 2022/6/16 10:40
*/
public class TestStream {
@Test
public void distinctTest(){
List<UserDao> list = new ArrayList<>();
list.add(new UserDao("1","张三","24","3800"));
list.add(new UserDao("2","张三","25","3800"));
list.add(new UserDao("3","李四","25","3800"));
list.add(new UserDao("4","李四","24","3800"));
list.add(new UserDao("5","王五","24","3800"));
list.add(new UserDao("6","王五","24","3800"));
//单个字段去重
List<UserDao> distinctList1 = list.stream()
.collect(Collectors
.collectingAndThen(Collectors
.toCollection(() -> new TreeSet<>(Comparator.comparing(UserDao :: getName))), ArrayList :: new));
System.out.println(distinctList1.toString());
//多个字段去重
List<UserDao> distinctList2 = list.stream()
.collect(Collectors
.collectingAndThen(Collectors
.toCollection(() -> new TreeSet<>(Comparator.comparing(x -> x.getAge() + x.getSalary()))), ArrayList :: new));
System.out.println(distinctList2.toString());
}
}
最终打印结果:
com.example.springbootdemo.TestStream,distinctTest
[1-张三-24-3800, 3-李四-25-3800, 5-王五-24-3800]
[1-张三-24-3800, 2-张三-25-3800]
Process finished with exit code 0