java8写一个共通方法实现下面的功能: 已知有多个字段的StreamA输入, 将流中多个字段相同时只保留最后一条数据。要求减少嵌套循环提高性能。
时间: 2024-05-03 15:16:59 浏览: 73
深入解析Jdk8中Stream流的使用让你脱离for循环
可以使用 `Collectors.toMap()` 方法来实现,具体实现如下:
```java
public static <T> List<T> distinctByLast(List<T> list, Function<T, Object[]> keyExtractor) {
Map<Object[], T> map = list.stream().collect(Collectors.toMap(keyExtractor, Function.identity(), (existing, replacement) -> replacement));
return new ArrayList<>(map.values());
}
```
其中,`keyExtractor` 函数用于将一个对象的多个字段组成一个数组作为该对象的唯一标识。`Collectors.toMap()` 方法会将流中的元素转换为一个 `Map`,并根据唯一标识进行去重,当遇到多个相同的唯一标识时,使用后面的元素进行覆盖。
使用示例:
```java
List<User> userList = Arrays.asList(
new User("Tom", 20),
new User("Jerry", 18),
new User("Tom", 25),
new User("Jerry", 21),
new User("Tom", 22)
);
List<User> distinctList = distinctByLast(userList, user -> new Object[]{user.getName()});
System.out.println(distinctList);
```
输出结果:
```
[User{name='Jerry', age=21}, User{name='Tom', age=22}]
```
其中,`User` 类的定义如下:
```java
public class User {
private String name;
private int age;
public User(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 "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
```
阅读全文