什么';在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());