Buf*_*lls 6 java lambda nullpointerexception java-8 java-stream
例如,对于此代码:
List<Class> classes =
Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
.map(className -> Class.forName(className))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
这段代码现在运行正常.但是,假设我们在流中有一个空列表,我们对流有大量操作.它可能会得到NullPointer异常等等.我发现尝试捕获这种语句也很困难.处理异常的正确方法是什么?
您不需要检查空值.如果您有一个空流,则将跳过所有操作:
Stream.of("hello")
.filter(e => "world".equals(e)) // empties the stream
.foreach(System.out::println); // no NullPointer, no output
Run Code Online (Sandbox Code Playgroud)
映射器中可以进行异常处理:
List<Class<?>> classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
.map(className -> {
try {
return Class.forName(className);
} catch (Exception e) {
throw new YourRuntimeException();
}
})
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
如果你想要忽略异常,那么我建议映射到Optionals.
List<Class<?>> classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
.map(className -> {
try {
return Optional.of(Class.forName(className));
} catch (Exception e) {
return Optional.<Class<?>>empty();
}
})
.filter(Optional::isPresent) // ignore empty values
.map (Optional::get) // unwrap Optional contents
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
另请参阅如何从Java 8流中抛出CHECKED异常?有关Class.forName结合java 8流的更详细讨论.
| 归档时间: |
|
| 查看次数: |
426 次 |
| 最近记录: |