How can I throw CHECKED exceptions from inside Java 8 streams?

前端 未结 18 1811
你的背包
你的背包 2020-11-22 06:59

How can I throw CHECKED exceptions from inside Java 8 streams/lambdas?

In other words, I want to make code like this compile:

public List

        
18条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-22 07:30

    I think this approach is the right one:

    public List getClasses() throws ClassNotFoundException {
        List classes;
        try {
            classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String").map(className -> {
                try {
                    return Class.forName(className);
                } catch (ClassNotFoundException e) {
                    throw new UndeclaredThrowableException(e);
                }
            }).collect(Collectors.toList());
        } catch (UndeclaredThrowableException e) {
            if (e.getCause() instanceof ClassNotFoundException) {
                throw (ClassNotFoundException) e.getCause();
            } else {
                // this should never happen
                throw new IllegalStateException(e.getMessage(), e);
            }
        }
        return classes;
    }
    

    Wrapping the checked exception inside the Callable in a UndeclaredThrowableException (that’s the use case for this exception) and unwrapping it outside.

    Yes, I find it ugly, and I would advise against using lambdas in this case and just fall back to a good old loop, unless you are working with a parallel stream and paralellization brings an objective benefit that justifies the unreadability of the code.

    As many others have pointed out, there are solutions to this situation, and I hope one of them will make it into a future version of Java.

提交回复
热议问题