使用 orElseThrow 时出现循环接口错误

Cyclic Interface Error when using orElseThrow

使用 Guava's ClassPath 我正在尝试初始化位于特定包中的 类,但我想使用构造函数进行初始化,因为它不会传播异常。所以这就是我得到构造函数的方法:

ClassPath.from(classLoader).getTopLevelClasses("test.package").stream()
    .map(ClassPath.ClassInfo::load)
    .map(Class::getConstructors)
    .map(Arrays::stream)
    .map(constructorStream -> constructorStream
        .filter(constructor -> constructor.getParameterCount() == 0)
        .findAny()
        .orElseThrow(RuntimeException::new)
    );

但是,这在 InteliJ 中给出了一个错误,只是简单地声明了循环接口。我想我知道循环接口是什么,但我不确定为什么会导致该错误。据我所知,只要知道 return 类型(对于 orElseThrow 它有一个 return 值,在这种情况下为 Constructor<?>)然后抛出一个未经检查的异常应该没事的。如果我使用 orElse(null) 那么错误就会消失。这是怎么回事,我该如何抛出我想抛出的 RuntimeException?

运行时异常是从映射 lambda 中抛出的。实际异常可以在 Stream api.

内部处理

为避免这种情况,您可以使用 flatMap 方法将当前流替换为提供给 flatMap 方法的组合流。这通常在组合流时使用。另见 adam bien's example on flatmap.

在此示例中,异常不必通过流 api - 因此您还可以使用已检查的异常,而不受没有 throws 子句的 Stream 接口中的签名的限制。

    ClassPath.from(classloader).getTopLevelClasses("test.package").stream()
            .map(ClassPath.ClassInfo::load)
            .map(Class::getConstructors)
            .flatMap(Arrays::stream)
            .filter(constructor -> constructor.getParameterCount() == 0)
                    .findAny()
                    .orElseThrow(RuntimeException::new);