list.stream 指定对象元素去重
时间: 2023-10-07 17:14:29 浏览: 117
可以使用 `distinct()` 方法来对 `Stream` 中的元素进行去重操作,例如:
```java
List<String> list = Arrays.asList("apple", "banana", "orange", "banana", "kiwi", "orange");
List<String> distinctList = list.stream().distinct().collect(Collectors.toList());
System.out.println(distinctList); // 输出结果为:[apple, banana, orange, kiwi]
```
这样就可以将 `list` 中重复的元素去掉,得到一个不含重复元素的新列表 `distinctList`。
相关问题
list.stream().distinct()指定属性进行去重
是的,`list.stream().distinct()`可以对List集合中的元素进行去重操作,如果需要按照对象的某个属性进行去重,可以使用Java8的`distinct()`方法配合Lambda表达式实现。
例如,假设我们有一个Person类,其中有name和age两个属性,现在我们需要按照name属性进行去重,代码如下:
```
List<Person> list = new ArrayList<>();
list.add(new Person("Tom", 20));
list.add(new Person("Jerry", 22));
list.add(new Person("Tom", 21));
list.add(new Person("Jerry", 22));
List<Person> distinctList = list.stream().distinct().collect(Collectors.toList());
List<Person> distinctListByName = list.stream().distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Person::getName))), ArrayList::new));
System.out.println(distinctList); // [Person{name='Tom', age=20}, Person{name='Jerry', age=22}, Person{name='Tom', age=21}]
System.out.println(distinctListByName); // [Person{name='Jerry', age=22}, Person{name='Tom', age=20}]
```
其中,`distinct()`方法可以去除List中的重复元素,但是默认情况下是根据元素的equals方法进行比较的,如果需要按照某个属性进行比较,则需要使用Lambda表达式指定比较方式。
上述代码中,我们使用了两种方式进行去重,第一种方式是直接使用`distinct()`方法进行去重,第二种方式是先通过`toCollection()`方法将List转换成TreeSet,再通过Lambda表达式指定比较方式,最后再将TreeSet转换成List,实现按照name属性进行去重。
list.stream().distinct() 可以使用多个条件进行去重吗
可以的。在使用`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表达式返回一个可以用于比较元素是否相等的值即可。