java8写一个共通方法:对于StreamA,将满足复数个skip条件的数据skip掉,生成新的Stream输出。已知StreamA已经按照skip排好序了,要求符合以流的形式边读边写的思想,输出的Stream保持原来的顺序
时间: 2024-03-12 15:45:26 浏览: 20
可以使用Stream的filter和count方法来实现这个共通方法。代码如下:
```java
public static <T> Stream<T> skipMulti(Stream<T> stream, int... skips) {
int[] sortedSkips = Arrays.stream(skips).sorted().toArray();
AtomicInteger skipIndex = new AtomicInteger();
return stream.filter(e -> {
int currentIndex = skipIndex.get();
if (currentIndex < sortedSkips.length && skipIndex.incrementAndGet() == sortedSkips[currentIndex]) {
return false;
}
return true;
}).sequential();
}
```
这个方法接受一个Stream和一个或多个skip条件,将满足这些条件的元素skip掉,生成新的Stream输出。为了保持顺序,需要将Stream设置为sequential()模式。
相关问题
java8写一个共通方法:对于StreamA,将满足skip条件的数据skip掉,生成新的Stream输出。已知StreamA已经按照skip排好序了,要求符合以流的形式边读边写的思想,输出的Stream保持原来的顺序
可以使用Stream的filter和count方法来实现这个共通方法。代码如下:
```java
public static <T> Stream<T> skip(Stream<T> stream, int skip) {
AtomicInteger skipIndex = new AtomicInteger();
return stream.filter(e -> skipIndex.getAndIncrement() >= skip).sequential();
}
```
这个方法接受一个Stream和一个skip条件,将满足这个条件的元素skip掉,生成新的Stream输出。为了保持顺序,需要将Stream设置为sequential()模式。
java8写一个共通方法:对于StreamA,在复数个breakKey相同时只保留最后一条,生成新的Stream输出。已知StreamA已经按照breakKey排好序了,要求全程以流的形式边读边写
可以使用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属性进行去重。