java集合去重(根据对象某个属性进行去重)

本文介绍了在Java中如何使用Stream API结合TreeSet实现对象列表的去重操作,具体包括根据用户年龄进行去重以及清空所有重复值的方法。示例代码展示了如何创建一个User对象列表,并通过比较User的age属性来达到去重目的。

集合元素为对象时,根据对象中属性去重操作,如下所示:

List<User> list = Arrays.asList(new User(3,"张三"), new User(2,"李四"),new User(2,"王五"));

1.根据 用户年龄去重:

List<User> newDto = list.stream().collect(
        Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing( u-> u.getAge()))), ArrayList::new)
);

结果为:new User(3,"张三"), new User(2,"李四")。

2.根据用户年龄把重复值清空

注:清空的意思为只要为重复值就都去掉

List<User> newDto = list.stream().collect( Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing( User :getAge()))), ArrayList::new) );

结果为:new User(3,"张三")。

Java 中实现对象集合对象某个属性,有多种方式,以下为几种常见实现示例: ### 方式一:使用 Java 8 流和 TreeSet ```java import java.util.*; import java.util.stream.Collectors; class Entity { private String property; public Entity(String property) { this.property = property; } public String getProperty() { return property; } } public class Main { public static void main(String[] args) { List<Entity> list = new ArrayList<>(); list.add(new Entity("value1")); list.add(new Entity("value2")); list.add(new Entity("value1")); List<Entity> distinctList = list.stream() .distinct() .collect(Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Entity::getProperty))), ArrayList::new)); distinctList.forEach(entity -> System.out.println(entity.getProperty())); } } ``` 此方法借助 Java 8 的流式编程和 `TreeSet` 达成按属性,`TreeSet` 会依据指定属性的比较器对元素进行排序并,最后再将其转换为 `ArrayList` [^4]。 ### 方式二:自定义谓词(Predicate) ```java import java.util.*; import java.util.function.Function; import java.util.function.Predicate; class Player { private String name; private int age; public Player(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Player{name='" + name + "', age=" + age + "}"; } } public class Main { public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Set<Object> seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); } public static void main(String[] args) { List<Player> playerList = new ArrayList<>(); playerList.add(new Player("Alice", 20)); playerList.add(new Player("Bob", 25)); playerList.add(new Player("Alice", 20)); List<Player> distinctPlayers = playerList.stream() .filter(distinctByKey(Player::getName)) .collect(Collectors.toList()); distinctPlayers.forEach(System.out::println); } } ``` 此方法定义了一个通用的谓词 `distinctByKey`,它利用 `ConcurrentHashMap.newKeySet()` 来记录已出现的属性,进而实现。该谓词可复用,适用于不同类型的对象集合 [^5]。 ### 方式三:使用 TreeSet 直接 ```java import java.util.*; class Player { private String name; private int age; public Player(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Player{name='" + name + "', age=" + age + "}"; } } public class Main { public static void main(String[] args) { List<Player> playerList = new ArrayList<>(); playerList.add(new Player("Alice", 20)); playerList.add(new Player("Bob", 25)); playerList.add(new Player("Alice", 20)); Set<Player> playerSet = new TreeSet<>(Comparator.comparing(Player::getName)); playerSet.addAll(playerList); List<Player> distinctPlayers = new ArrayList<>(playerSet); distinctPlayers.forEach(System.out::println); } } ``` 此方法直接运用 `TreeSet` 和属性比较器来对集合进行,`TreeSet` 会依据属性比较器对元素进行排序并,最后再转换为 `ArrayList` [^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值