java8写一个共通方法:对于StreamA,在复数个breakKey相同时只保留最后一条,生成新的Stream输出。已知StreamA已经按照breakKey排好序了,要求实现方式符合以流的形式边读边写的思想
时间: 2024-03-11 20:50:35 浏览: 119
Java8-遇见Lambda.pptx
可以使用Collectors.toMap()方法实现该方法,代码如下:
```java
public static <T> Stream<T> removeDuplicateByKey(Stream<T> stream, Function<? super T, ?> breakKey) {
Map<Object, T> map = stream.collect(Collectors.toMap(breakKey, Function.identity(), (key1, key2) -> key2));
return map.values().stream();
}
```
其中,Function<? super T, ?> breakKey参数表示用于分组的属性,可以是任何类型。在collect()操作时,使用Collectors.toMap()方法将Stream中的元素按照breakKey进行分组,并且在分组时如果出现重复的breakKey,则取最后一条记录,以保证只保留最后一条记录。最后,使用map.values().stream()方法将Map中的value转换为Stream输出。
使用示例如下:
```java
List<Person> personList = new ArrayList<>();
personList.add(new Person("Tom", 18));
personList.add(new Person("Jerry", 20));
personList.add(new Person("Mike", 18));
personList.add(new Person("Jerry", 22));
personList.add(new Person("Kate", 18));
Stream<Person> stream = personList.stream().sorted(Comparator.comparing(Person::getAge));
Stream<Person> newStream = removeDuplicateByKey(stream, Person::getAge);
newStream.forEach(System.out::println);
```
输出结果为:
```
Tom,18
Mike,18
Jerry,22
Kate,18
```
可以看到,按照年龄分组后只保留了每个年龄的最后一条记录。
阅读全文