我正在尝试扩展Java 8的Stream实现。

我有这个界面:

public interface StreamStuff<T> extends Stream<T> {

    Stream<T> delegate();
    default Stream<T> biggerThanFour() {
        return delegate().filter(i -> ((Double)i > 4));
    }
}

在我的主要方法中:
int arr [] = {1,2,3,4,5,6};

Object array [] = ((StreamStuff)Arrays
            .stream(arr))
            .biggerThanFour()
            .toArray();

我正在尝试将Stream强制转换为我的界面StreamStuff,并使用我的方法。

我收到以下错误:



我在执行以下操作时遇到相同的错误:
StreamStuff ss = (StreamStuff)Arrays.stream(arr);
我想知道这种事情是否可能,如果可以,我如何实现呢?供引用,我有点使用this article作为指导。

最佳答案

如前所述,您可以创建自己的包装器实现:

public class MyStream<T> implements Stream<T> {

    private final Stream<T> delegate;

    public MyStream(Stream<T> delegate) {
        this.delegate = delegate;
    }

    @Override
    public Stream<T> filter(Predicate<? super T> predicate) {
        return delegate.filter(predicate);
    }

    @Override
    public void forEach(Consumer<? super T> action) {
        delegate.forEach(action);
    }

    MyStream<T> biggerThanFour() {
        return new MyStream<>(delegate.filter(i -> ((Double) i > 4)));
    }

    // all other methods from the interface
}

您将必须从接口(interface)委派所有方法,因此该类将非常大。您可以考虑添加一个StreamWrapper类,该类将委派接口(interface)中的所有方法,然后使您的实际类StreamStuff扩展StreamWrapper。这将使您只能在StreamStuff中使用自定义方法,而不能使用其他流方法。您还可以使StreamWrapper中所有被覆盖的方法最终化,以避免意外覆盖它们。

然后,您可以像这样使用它:
public static void main(String[] args) {
    Stream<Double> orgStream = Stream.of(1.0, 3.0, 7.0, 2.0, 9.0);

    MyStream<Double> myStream = new MyStream<>(orgStream);

    myStream.biggerThanFour().forEach(System.out::println);
}

自定义方法返回一个新的包装器,因此您可以将调用链接到自定义方法。

只需注意,您对Double的转换可能会抛出ClassCastException,因此您可以考虑使用T替换通用的Double,从而将委托(delegate)流限制为该特定类型。

10-04 10:03