Java Stream() 流根据对象属性去重
代码
方式一:
根据stream内置方法去重
// 引入了两个静态方法,以及通过 TreeSet<> 来达到获取不同元素的效果
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
// 初始化
List<User> userList = new ArrayList<User>() {{
add(new User(1L, "张一", "男"));
add(new User(1L, "张一", "男"));
add(new User(2L, "张二", "男"));
add(new User(3L, "张三", "男"));
add(new User(4L, "张四", "女"));
add(new User(4L, "张四", "男"));
add(new User(5L, "张五", "男"));
add(new User(5L, "张六", "男"));
add(new User(5L, "张七", "男"));
}};
// 筛选,根据User对象ID属性去重,并创建新的集合存放筛选过后的对象
List<User> collect = userList.stream().collect(
collectingAndThen(
toCollection(() -> new TreeSet<>(Comparator.comparing(User::getId))),
ArrayList::new
)
);
// 打印
for (User user : collect) {
System.out.println("user = " + user);
}
方式二:
根据Map的Key不能重复的方式进行去重
Collectors.toMap使用方法:https://www.cnblogs.com/lucky-jun/p/16469369.html
//Collectors.toMap(Map的key, Map的value, 当key重复时使用使用哪个key)
// 去重
Map<String, User> collect = userList.stream().collect(Collectors.toMap(User::getId, u -> u, (key1, key2) -> key1));
// 打印,打印结果可能与下述截图排序有区别,但结果一致
Set<String> keySet = collect.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
User user = collect.get(key);
System.out.println(user);
}
打印结果


浙公网安备 33010602011771号