list.stream().distinct() 可以使用多个条件进行去重吗
时间: 2023-11-15 17:14:22 浏览: 254
可以的。在使用`distinct()`方法进行去重时,你可以使用Java 8中的Lambda表达式来指定你的去重规则。具体方法是使用`distinct()`方法的重载版本,该方法接受一个`Function`类型的参数,这个参数用于指定去重规则。这个`Function`类型的参数应该返回一个可以用于比较元素是否相等的值,相同的元素应该返回相同的值,不同的元素应该返回不同的值。这里提供一段示例代码:
```
List<Person> list = new ArrayList<>();
list.add(new Person("张三", "男", 20));
list.add(new Person("李四", "男", 21));
list.add(new Person("王五", "男", 20));
list.add(new Person("赵六", "女", 22));
list.add(new Person("张三", "男", 20));
List<Person> distinctList = list.stream().distinct().collect(Collectors.toList());
List<Person> distinctList2 = list.stream().distinct(person ->
person.getName() + person.getGender() + person.getAge()
).collect(Collectors.toList());
System.out.println("去重前:" + list.size() + " 条数据");
System.out.println("去重后1:" + distinctList.size() + " 条数据");
System.out.println("去重后2:" + distinctList2.size() + " 条数据");
class Person {
private String name;
private String gender;
private int age;
public Person(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
public int getAge() {
return age;
}
}
```
这段代码中,我们定义了一个`Person`类,包含姓名、性别和年龄三个属性。我们使用`distinct()`方法对这个包含了多个`Person`对象的List进行去重,我们提供了两种去重方法:
1. 第一种方法直接使用`distinct()`方法进行去重,这种方式会默认使用`Person`对象的`equals()`方法进行比较,由于`Person`类没有重写`equals()`方法,所以默认使用的是Object类的`equals()`方法,因此不会进行去重。
2. 第二种方法使用Lambda表达式指定了去重规则,我们使用`Person`对象的姓名、性别和年龄三个属性的组合作为去重规则,将这三个属性组成一个字符串,并返回这个字符串。这种方式会根据这个字符串进行去重,最终输出去重前后List中的数据条数。
你可以根据自己的需要编写不同的去重规则,只需要使用Lambda表达式返回一个可以用于比较元素是否相等的值即可。
阅读全文