什么';在Java8中,在链式语句中检查null或异常的正确方法是什么?
例如,对于此代码:什么';在Java8中,在链式语句中检查null或异常的正确方法是什么?,java,lambda,nullpointerexception,java-8,java-stream,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()); 列出类= Stream.of(“java.lang
List<Class> classes =
Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
.map(className -> Class.forName(className))
.collect(Collectors.toList());
列出类=
Stream.of(“java.lang.Object”、“java.lang.Integer”、“java.lang.String”)
.map(className->Class.forName(className))
.collect(Collectors.toList());
这段代码现在运行良好。但是,假设流中有一个空列表,并且流中有大量的操作。它可能会出现空指针异常等。
我发现也很难抓住这种说法。
处理此异常的正确方法是什么?您不需要检查空值。如果流为空,则将跳过所有操作:
Stream.of("hello")
.filter(e => "world".equals(e)) // empties the stream
.foreach(System.out::println); // no NullPointer, no output
在mapper中可以进行异常处理:
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());
关于
Class.forName
与java 8 streams的结合,请看一看更详细的讨论。您的问题有点奇怪。您声称“此代码现在运行正常”,但它应该生成编译时错误,因为您没有处理由Class.forName
声明的选中异常。此外,您谈论的是空列表,但在代码中,不涉及任何列表。这同样适用于对NullPointerException
的引用,因为您的代码在任何地方都不会生成null
最可能的情况是,您所说的代码捕获了ClassNotFoundException
,并通过返回null
来处理它。你不应该这样做。如果要筛选出故障,可以通过以下方式进行:
List<Class<?>> classes =
Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
.flatMap(className -> {
try {
return Stream.of(Class.forName(className));
} catch (ClassNotFoundException ex) {
// recommended: insert logging statement here
return Stream.empty();
}
})
.collect(Collectors.toList());
什么?如果为空,则不会应用任何内容。试着接球?哪里为什么?你说的“流中的空列表”是什么意思?您的流是字符串,而不是列表。您的意思是“流中的空字符串”吗?
=>
。请注意,映射到Optional
、通过Optional.isPresent进行过滤以及展开Optional
这三个步骤都非常复杂。单个flatMap
可以执行此操作。
List<Class<?>> classes =
Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String")
.flatMap(className -> {
try {
return Stream.of(Class.forName(className));
} catch (ClassNotFoundException ex) {
// recommended: insert logging statement here
return Stream.empty();
}
})
.collect(Collectors.toList());