java8写一个共通方法实现下面的功能: 已知有多个字段的StreamA输入, 将流中多个字段相同时只保留最后一条数据。要求减少嵌套循环提高性能。
时间: 2024-05-08 16:21:35 浏览: 99
Java 8 之 流(Stream)
可以使用collect方法结合Collectors.toMap实现这个功能。具体实现如下:
```java
public static <T> List<T> filterDuplicate(List<T> list, Function<T, ?>... keyExtractors) {
return new ArrayList<>(list.stream()
.collect(Collectors.toMap(
t -> Arrays.stream(keyExtractors).map(keyExtractor -> keyExtractor.apply(t)).collect(Collectors.toList()),
Function.identity(),
(oldValue, newValue) -> newValue
))
.values());
}
```
这个方法接收一个List类型的参数list和多个Function类型的参数keyExtractors,返回一个去重后的List。
在方法内部,我们首先将list转成Stream类型,然后通过Collectors.toMap方法将Stream转成Map。toMap方法的第一个参数是Function类型的keyMapper,用于将List中的元素转成Map中的键。由于我们的去重条件是多个字段相同时只保留最后一条数据,因此我们需要将多个字段的值组成一个List作为Map的键。这里我们使用了Arrays.stream和map方法将多个keyExtractors转成一个List。
toMap方法的第二个参数是Function类型的valueMapper,用于将List中的元素转成Map中的值。由于我们需要保留最后一条数据,因此直接返回Function.identity(),表示将List中的元素作为Map中的值。
toMap方法的第三个参数是BinaryOperator类型的mergeFunction,用于处理Map中键冲突的情况。由于我们需要保留最后一条数据,因此直接返回newValue,表示将最新的值覆盖旧的值。
最后,我们通过Map的values方法将去重后的值转成一个Collection类型的集合,并将其转成ArrayList类型的List返回。
阅读全文