Java 从流本身使用流参数调用方法
假设我们有以下情况Java 从流本身使用流参数调用方法,java,java-stream,Java,Java Stream,假设我们有以下情况 Collection<SomeType> someCollection = .. Stream<SomeType> stream = someCollection.stream(); methodWithStreamArgument(stream) java默认库中不存在这样的方法。但是,通过将现有流包装到另一个类中,您始终可以进行自己的扩展 public class MyStream<T> implements Stream<T&
Collection<SomeType> someCollection = ..
Stream<SomeType> stream = someCollection.stream();
methodWithStreamArgument(stream)
java默认库中不存在这样的方法。但是,通过将现有流包装到另一个类中,您始终可以进行自己的扩展
public class MyStream<T> implements Stream<T> {
private final Stream<T> original;
public MyStream(Stream<T> original){
this.original = original;
}
// here your own method
public <V> MyStream<V> call(Function<? super Stream<T>, ? extends Stream<V>> mapper){
return new MyStream<>(mapper.apply(this));
}
// override/implement every method like the following
@Override
public MyStream<T> filter(Predicate<T> predicate){
return new MyStream<>(stream.filter(predicate));
}
...
}
更重要的问题可能是:为什么要找到这样一个方法?流本身可以是
流
,所以有很多方法都是适用的。@Sweeper,这样我就可以在一个语句中编写它。你的意思是这样的methodWithStreamArgument(someCollection.stream())
但是标准集合不会返回这样的自定义流,是吗it@MagnusLutz请参见编辑。您还可以创建一个静态
方法(比如Stream#of()
),但这将是一个设计选择
streamHandlingMethod(someCollection.stream()
.filter(..)
.map(..)
//many other stream returning calls
)
public class MyStream<T> implements Stream<T> {
private final Stream<T> original;
public MyStream(Stream<T> original){
this.original = original;
}
// here your own method
public <V> MyStream<V> call(Function<? super Stream<T>, ? extends Stream<V>> mapper){
return new MyStream<>(mapper.apply(this));
}
// override/implement every method like the following
@Override
public MyStream<T> filter(Predicate<T> predicate){
return new MyStream<>(stream.filter(predicate));
}
...
}
new MyStream<>(someCollection.stream()) // wrap with MyStream
.call(this::methodWithStreamArgument) // execute a call
.forEach(...); // terminal operation