java8写一个共通方法:根据条件过滤StreamA并生成新的Stream输出。已知StreamA已经按照条件排好序了,要求输出Stream保持原来的顺序,并且全程以流的形式实现边读边写的需求
时间: 2024-03-12 09:49:39 浏览: 82
可以编写一个方法,接受一个已排序的Stream和一个过滤条件,返回一个新的Stream,其中满足条件的元素被保留,不满足条件的元素被过滤掉。具体实现如下:
```java
import java.util.function.Predicate;
import java.util.stream.Stream;
public class StreamUtils {
public static <T> Stream<T> filter(Stream<T> stream, Predicate<T> condition) {
return Stream.concat(
stream.takeWhile(condition.negate()),
stream.dropWhile(condition.negate())
.filter(condition)
);
}
}
```
这个方法的实现同样基于Stream的几个操作:`takeWhile`、`dropWhile`和`concat`。具体实现中,我们先使用`takeWhile`取出不满足条件的元素,然后使用`dropWhile`跳过不满足条件的元素,再使用`filter`操作保留满足条件的元素,将剩余的元素拼接起来,生成新的Stream。
使用这个方法的示例代码如下:
```java
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
Stream<Integer> stream = Stream.of(1, 3, 5, 7, 9, 11);
Stream<Integer> filtered = StreamUtils.filter(stream, x -> x > 5);
System.out.println(filtered.collect(Collectors.toList()));
}
}
```
这个示例代码中,我们创建了一个整数的Stream,其中包含了1到11的奇数。然后,我们调用`StreamUtils.filter`方法,将所有大于5的元素过滤掉,生成一个新的Stream。最后,我们使用`collect`操作将新的Stream转换为一个List,并输出结果。输出结果为`[7, 9, 11]`,符合预期。
阅读全文