Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从流本身使用流参数调用方法_Java_Java Stream - Fatal编程技术网

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