我正在尝试扩展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)流限制为该特定类型。