Ask*_*kov 4 java lambda exception-handling java-8
如果在调用构建流链的任何元素期间发生异常,是否有一种方法可以关闭Stream?
例如,代码:
Stream.of(new Object())
.filter(e -> {
if (true) throw new IllegalStateException();
return true;
})
.onClose(() -> System.out.println("OnClose"))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
将产生以下输出:
Exception in thread "main" java.lang.IllegalStateException
at my.className.lambda$main$2(LdapRealm.java:114)
at my.className$$Lambda$1/1607521710.test(Unknown Source)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.stream.Streams$StreamBuilderImpl.forEachRemaining(Streams.java:419)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at my.className.main(LdapRealm.java:118)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Run Code Online (Sandbox Code Playgroud)
请注意,未打印"OnClose"消息,因为尚未调用onClose().如果我希望第三方代码使用此流并且我不确定该代码是否有助于try/catch+ Autocloseable功能,是否有任何解决此问题的好方法?
如果您的类的用户不使用try/finally或try-with-resources,则您无法对清理做任何事情.(除了终结器,这不是一个好的解决方案.)
如果您有一个返回流的函数
Stream<Object> getStream() {
return Stream.of(new Object())
.filter(e -> {
if (true) throw new IllegalStateException();
return true;
})
.onClose(() -> System.out.println("OnClose"));
}
Run Code Online (Sandbox Code Playgroud)
那么这个功能的正确用法是
List<Object> result;
try (Stream<Object> s = getStream()) {
result = s.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1330 次 |
| 最近记录: |