java8写一个共通方法:对于StreamA,在复数个breakKey相同时只保留最后一条,生成新的Stream输出。已知StreamA已经按照breakKey排好序了,要求实符合全程以流的形式边读边写的思想
时间: 2024-03-12 07:43:27 浏览: 80
Java8-遇见Lambda.pptx
可以使用Java 8的Stream API和Collectors.groupingByConcurrent()方法来实现这个共通方法。具体实现如下:
```java
public static <T> Stream<T> keepLast(Stream<T> streamA, Function<T, ?>... breakKeys) {
Map<List<?>, T> map = new ConcurrentHashMap<>();
return streamA.parallel().filter(t -> {
List<?> keys = Arrays.stream(breakKeys).map(key -> key.apply(t)).collect(Collectors.toList());
map.put(keys, t);
return true;
}).map(t -> {
List<?> keys = Arrays.stream(breakKeys).map(key -> key.apply(t)).collect(Collectors.toList());
return map.get(keys);
});
}
```
其中,`breakKeys`参数是一个可变参数,表示按照哪些属性进行分组。`ConcurrentHashMap`用于保证线程安全,`filter()`方法将所有元素都添加到Map中,`map()`方法根据分组的Key获取Map中最后一个元素。最后,返回一个新的Stream对象。
使用示例如下:
```java
List<MyObject> list = Arrays.asList(
new MyObject("A", 1),
new MyObject("A", 2),
new MyObject("B", 3),
new MyObject("B", 4),
new MyObject("B", 5),
new MyObject("C", 6),
new MyObject("C", 7),
new MyObject("C", 8)
);
Stream<MyObject> streamA = list.stream().sorted(Comparator.comparing(MyObject::getA));
Stream<MyObject> newStream = keepLast(streamA, MyObject::getA);
newStream.forEach(System.out::println);
```
输出结果为:
```
MyObject{a='A', b=2}
MyObject{a='B', b=5}
MyObject{a='C', b=8}
```
可以看到,对于相同的`a`属性,只保留了最后一个元素。
阅读全文