在使用java8的stream流时,可以使用
list.stream().distinct().collect(Collectors.toList());
方法来对list中的对象进行去重,但是这个方法需要list中保存的类重写对应的equals方法以及hashCode方法。但是如果我们只是需要根据对象的某个属性来去重,怎么办呢?
我们可以使用一个取巧的办法,通过stream流中key转map的方法将数据转成一个Map对象,之后读取Map中的values值来获取去重后的List。
主要代码:
Map<String, User> map = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (v1, v2) -> v1));
list = new ArrayList<>(map.values());
其中(v1,v2)->v1位置可以自己实现当key冲突之后,去重规则是怎样的,即保留哪个值。
完整测试代码:
public class Test {
public static void main(String[] args) {
//获取数据
List<User> list = getList();
//去重
Map<String, User> map = list.stream().collect(Collectors.toMap(User::getName, Function.identity(), (v1, v2) -> v1));
list = new ArrayList<>(map.values());
//打印数据
printList(list);
}
private static List<User> getList() {
return Arrays.asList(
new User("小赵",20),
new User("小钱",9),
new User("小赵",18),
new User("小李",13)
);
}
private static void printList(List list){
list.forEach(System.out::println);
System.out.println("==============\n");
}
}
@Data
@ToString
@AllArgsConstructor
class User{
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
}