java8写一个共通方法:对于StreamA,在复数个breakKey相同时只保留最后一条,生成新的Stream输出。已知StreamA已经按照breakKey排好序了,要求全程以流的形式边读边写
时间: 2024-03-11 20:50:20 浏览: 84
实用的 Java 8 Stream 代码
可以使用Java 8的Stream API中的groupingBy方法和Collectors.toMap方法来实现此共通方法。
具体实现代码如下:
```java
public static <T> Stream<T> filterDuplicate(Stream<T> streamA, Function<T, ?>... breakKeys) {
Map<List<?>, T> map = new LinkedHashMap<>();
return streamA.filter(t -> {
List<?> keyList = Arrays.stream(breakKeys).map(f -> f.apply(t)).collect(Collectors.toList());
return map.put(keyList, t) == null;
}).flatMap(t -> map.values().stream().filter(t::equals));
}
```
方法的参数为一个Stream对象streamA和一个或多个Function对象breakKeys,用于指定需要去重的属性。该方法首先使用groupingBy方法将streamA按照breakKeys分组,然后使用Collectors.toMap方法将每组中的最后一个元素存储到一个LinkedHashMap中。接着,使用filter方法过滤掉重复元素,并使用flatMap方法将结果展开成一个Stream对象输出。
注意,该方法使用了LinkedHashMap来保存元素的顺序,保证了保留最后一条的要求。同时,该方法也支持多个breakKey属性进行去重。
阅读全文