stream 过滤重复的值 排序
时间: 2024-10-20 14:03:28 浏览: 13
Stream API 在Java中是一个强大的工具,用于处理集合数据的一系列操作,其中包括过滤重复的值并排序。你可以通过以下步骤来实现:
1. **过滤重复**:
使用 `distinct()` 方法可以去除流中重复的元素。例如:
```java
List<Integer> list = Arrays.asList(1, 2, 3, 4, 2, 5);
Stream<Integer> filteredStream = list.stream().distinct();
```
这将创建一个新的流,其中只包含列表中不重复的元素。
2. **排序**:
使用 `sorted()` 方法可以根据指定的比较器对流中的元素进行排序。例如,如果你想按照数字大小排序:
```java
List<Integer> sortedList = filteredStream.sorted().collect(Collectors.toList());
```
如果你需要自定义排序规则,可以传递一个Comparator实例给 `sorted()` 函数。
相关问题
stream 过滤重复的值 按某个字段排序
在Java中,`Stream` API是一个强大的工具,用于处理集合数据。如果你想过滤掉流中的重复值并按某个字段对元素进行排序,可以使用以下步骤:
1. **过滤重复值**:
使用`distinct()`方法可以去除流中的重复元素。例如,如果你有一个整数列表`List<Integer>`,你可以这样做:
```java
List<Integer> uniqueValues = values.stream()
.distinct() // 去除重复
.collect(Collectors.toList());
```
2. **按字段排序**:
对于有自定义比较规则的对象,你可以通过传递一个`Comparator`到`sorted()`方法来指定排序依据。假设你有一个包含自定义类`Person`的列表,`Person`类有一个`age`字段,你可以按年龄排序:
```java
class Person {
int age;
// ...其他属性...
}
List<Person> sortedPeople = people.stream()
.sorted(Comparator.comparing(Person::getAge)) // 按age字段排序
.collect(Collectors.toList());
```
如果你想保持原始列表不变,可以创建一个新的排序后的列表。
java8新特性将list中按指定属性排序过滤重复数据的方法
Java8新增了一个非常方便的方法java.util.stream.Stream,它为我们提供了一些非常有用的方法来对集合进行操作。List集合中按指定属性排序并过滤重复数据也可以通过Stream来实现。
首先,我们需要实现一个Comparator接口,该接口的作用是根据指定的属性来对List集合进行排序。Comparator接口中定义了一个compare方法,我们需要重写该方法并根据自己的需要来实现排序功能。
在排序完成之后,我们还需要使用Stream.distinct()方法来过滤重复的数据,该方法能够将重复的数据过滤掉,只留下不同的数据。
下面是一个示例代码:
```
public class Main {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Tom", 25));
persons.add(new Person("John", 30));
persons.add(new Person("Peter", 25));
persons.add(new Person("Tom", 28));
persons.add(new Person("Peter", 25));
List<Person> result = persons.stream()
.sorted((p1, p2) -> p1.getName().compareTo(p2.getName()))
.distinct()
.collect(Collectors.toList());
System.out.println(result);
}
}
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 +
'}';
}
}
```
以上代码中,我们先创建了一个Person类,用于存储人员信息,然后创建了一个List集合persons,该集合包含了五个Person对象。接着,我们使用Stream来对该集合进行排序和去重操作,并将结果存入到一个新的List集合中。
在排序操作中,我们使用了一个Lambda表达式来实现对Person对象按照姓名属性进行排序。在去重操作中,我们直接使用了Stream.distinct()来实现。
最终,我们打印出了排序并去重之后的List集合中的内容,运行结果如下:
```
[Person{name='John', age=30}, Person{name='Peter', age=25}, Person{name='Tom', age=25}, Person{name='Tom', age=28}]
```
可以看到,重复的数据被过滤掉了,且排序也符合我们的要求。使用Java8中的Stream和Lambda表达式,使代码更加简洁易读,提高了代码的可维护性和可读性。
阅读全文