在Java 8中检查null或检查链接语句中的异常的正确方法是什么?

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异常等等.我发现尝试捕获这种语句也很困难.处理异常的正确方法是什么?

sla*_*dan 8

您不需要检查空值.如果您有一个空流,则将跳过所有操作:

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流的更详细讨论.

  • 也不是`=>`.注意,三个步骤,映射到`Optional`,通过`Optional.isPresent`过滤,并解开`Optional`是不必要的复杂.单个`flatMap`可以执行操作. (2认同)