写业务代码的时候碰到一个业务场景,集合需要根据某个字段去重.
自己写的太多,所以到网上找了一个简洁的方案,一行解决了,运行也没有问题.
但是不太看得懂代码原理,到网上查了点资料弄明白了,在此记录一下
核心代码,要用的拿这行去,改下参数名就行了:
userList = userList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getUserid))), ArrayList::new));
展开的样子:
userList = userList.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(
Comparator.comparing(User::getUserid)
)
), ArrayList::new
)
);
我的理解都在注释里面了:
(用到的User类在文章末尾)
public static void main(String[] args) {
List<User> userList = new ArrayList<>();
userList.add(new User("1", "李大锤", "23", "南京"));
userList.add(new User("2", "张无忌", "18", "西安"));
userList.add(new User("3", "刘德华", "26", "苏州"));
userList.add(new User("4", "郭靖", "33", "上海"));
userList.add(new User("1", "李大锤", "23", "南京")); //id相同,其他数据也相同
userList.add(new User("3", "带头大哥", "36", "杭州")); //id相同,其他数据不同
System.out.println("原始数据:" + userList);
//使用stream流,然后可以使用steam中才能用的API
userList = userList.stream().collect(
// collectingAndThen: 第一个参数是 Collectors,第二个参数是Function,用来处理第一个参数
Collectors.collectingAndThen(
// toCollection: 把TreeSet转为Collectors类
Collectors.toCollection(
// 根据userId去重,主要是利用了 TreeSet的有序不重复特性,并且TreeSet能传入比较器,就能根据某一字段去重
() -> new TreeSet<>( Comparator.comparing(
//这里是 User::getUserid 写法的lambda表达式写法
user -> user.getUserid()
))
)
, //这里是 ArrayList::new 的lambda表达式写法,将上面的 TreeSet转为ArrayList
treeSet -> new ArrayList<>(treeSet)
)
);
System.out.println("去重后数据:"+ userList);
}
如果还没看懂,可能就要百度下相关API 的用法了.
这里是看懂之后我自己写的 :
public static void main(String[] args) {
User u1 = new User("1", "李大锤", "23", "南京");
User u2 = new User("2", "张无忌", "18", "西安");
User u3 = new User("3", "刘德华", "26", "苏州");
User u4 = new User("4", "郭靖", "33", "上海");
User u5 = new User("1", "李大锤", "23", "南京"); //id相同,其他数据也相同
User u6 = new User("3", "带头大哥", "36", "杭州"); //id相同,其他数据不同
ArrayList<User> userList = new ArrayList<>();
userList.add(u1);
userList.add(u2);
userList.add(u3);
userList.add(u4);
userList.add(u5);
userList.add(u6);
System.out.println("原始数据:" + userList);
userList = new ArrayList<>( userList.stream().collect(Collectors.toCollection(() -> new TreeSet<User>(Comparator.comparing(User::getUserid)))) );
System.out.println("去重后数据:"+ userList);
}
用到的对象类:
public class User {
private String userid;
private String username;
private String age;
private String address;
public User(String userid, String username, String age, String address) {
super();
this.userid = userid;
this.username = username;
this.age = age;
this.address = address;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User [userid=" + userid + ", username=" + username + ", age=" + age + ", address=" + address + "]";
}
}