使用 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);
使用 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);