使用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中给出了一个错误,只是简单地说明了Cyclic接口。我想我知道Cyclic接口是什么,但我不确定为什么会导致这个错误。据我所知,只要返回类型已知(对于orElseThrow
,它的返回值为Constructor<?>
),那么抛出未经检查的异常应该没问题。如果我使用orElse(null)
,那么错误就会消失。这里发生了什么以及如何抛出我想抛出的RuntimeException?
答案 0 :(得分:0)
从mapλ中抛出runtimeexception。可以在Stream api中处理该异常。
为了避免这种情况,您可以使用flatMap方法将当前流替换为提供给flatMap方法的组合流。这在组合流时通常使用。另请参阅adam bien's example on flatmap.
在此示例中,异常不必通过流API - 因此您也可以使用已检查的异常,而不受Stream接口中没有throws子句的签名限制。
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);