自学内容网 自学内容网

Java stream流根据对象属性去重

在Java中,Stream API提供了一种简洁而强大的方法来处理集合数据。如果你需要根据对象的某个属性去重,可以利用Collectors.toMap来实现这一点。以下是一个示例,展示了如何根据对象的某个属性去重,并保留具有该属性值的第一个或最后一个遇到的对象。
假设我们有一个Person类,它有name和age两个属性,我们希望根据name属性去重。
示例代码
java
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.stream.Collectors;

class Person {
private String name;
private int age;

public Person(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 "Person{name='" + name + "', age=" + age + "}";
}

}

public class Main {
public static void main(String[] args) {
List people = Arrays.asList(
new Person(“Alice”, 25),
new Person(“Bob”, 30),
new Person(“Alice”, 35),
new Person(“Charlie”, 40)
);

    // 保留具有相同name的第一个Person对象
    List<Person> uniquePeopleFirst = people.stream()
            .collect(Collectors.toMap(
                    Person::getName, // keyMapper,用作唯一键
                    person -> person, // valueMapper,保留原始对象
                    (existing, replacement) -> existing // mergeFunction,决定保留哪个对象
            )).values().stream()
            .collect(Collectors.toList());

    System.out.println("Unique people (first occurrence):");
    uniquePeopleFirst.forEach(System.out::println);

    // 保留具有相同name的最后一个Person对象
    List<Person> uniquePeopleLast = people.stream()
            .collect(Collectors.toMap(
                    Person::getName, // keyMapper,用作唯一键
                    person -> person, // valueMapper,保留原始对象
                    (existing, replacement) -> replacement // mergeFunction,决定保留哪个对象
            )).values().stream()
            .collect(Collectors.toList());

    System.out.println("Unique people (last occurrence):");
    uniquePeopleLast.forEach(System.out::println);
}

}
解释
people.stream():将列表转换为流。
Collectors.toMap():使用三个参数版本的toMap收集器:
keyMapper:Person::getName,根据name属性生成键。
valueMapper:person -> person,保留原始对象作为值。
mergeFunction:决定在键冲突时如何处理。
(existing, replacement) -> existing:保留第一个遇到的对象。
(existing, replacement) -> replacement:保留最后一个遇到的对象。
.values().stream().collect(Collectors.toList()):从Map中提取值,并将其转换回列表。
这种方法不仅简洁,而且利用了Java 8引入的Stream API的强大功能,使得集合操作更加直观和高效。


原文地址:https://blog.csdn.net/chi_666/article/details/142384630

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!