【发布时间】:2019-05-25 17:57:32
【问题描述】:
我希望实现Stream<E> 接口(我承认,它是不必要的大接口)并添加一个构建器方法foo()。
public MyStream<E> implements Stream<E>, ExtendedStream<E> {
private final Stream<E> delegate;
public MyStream(final Stream<E> stream) {
this.delegate = stream;
}
// a sample Stream<E> method implementation
@Override
public <R> MyStream<R> map(Function<? super E, ? extends R> mapper) {
return new MyStream<>(this.delegate.map(mapper));
}
// the rest in the same way (skipped)
// a method from ExtendedStream<E>
@Override
public MyStream<E> foo() {
return new MyStream(this.delegate.......);
}
}
到目前为止一切顺利。
long count = new MyStream(list.stream())
.map(i -> i * 10)
.foo()
.filter(i -> i > 100)
.count();
Stream 的 Closeable 行为有问题。 Stream 的文档说关于关闭(格式化我的):
流有一个
BaseStream.close()方法并实现AutoCloseable,但几乎所有流实例在使用后实际上都不需要关闭。一般只有源为 IO 通道的流(如Files.lines(Path, Charset))返回的流才需要关闭。
关闭 Stream 的唯一方法是 flatMap 或 close。
Eclipse Oxygen 中的对象实例化带有警告下划线:
资源泄漏:'
<unassigned Closeable value>' 永远不会关闭
这无法通过 IntelliJIdea 2018.1.5 重现。我浏览的相关问题是here 和here。我了解File 或Dictionary 的Closeable 问题,但是,我坚持使用Streams。
我不喜欢调用私有构造函数的静态方法MyStream.of(...)。
【问题讨论】:
-
你试过给它类型参数吗?新的
MyStream<Long>(list.stream())... -
@DamianLattenero:而不是
MyStream<Integer>,因为原点是List<Integer>。是的,我做到了,没有区别。 -
我遇到了类似的问题,但在我的情况下不是
Stream接口的实现。相反,在 TotalCross 中,可以访问 Java 8 提供的功能接口(但不是默认方法或静态方法,只是抽象方法),但与j.u.Stream没有任何相似之处。因此,我实现了我自己版本的Stream(项目here),但有平台限制。我忘记添加BaseStream方法,所以我现在才注意到我的实现中没有任何close... -
为了解决这个问题,我的类没有实现
AutoCloseable,而是声明了一个方法close。还创建了一个StreamHolder类,该类接收Stream并且可自动关闭,调用Stream关闭方法并允许检索原始Stream(尚未推送) -
出于好奇,我已经朝着这个目标推进了一些工作:gitlab.com/geosales-open-source/totalcross-functional-toolbox/-/… ;我是巴西人,主要讲葡萄牙语,我的同事也是讲葡萄牙语的巴西人,所以我在 repo/code 中的文字主要是葡萄牙语
标签: java eclipse memory-leaks java-8 java-stream