gpt4 book ai didi

java - 使用 orElseThrow 时出现循环接口(interface)错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:57:41 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

关于java - 使用 orElseThrow 时出现循环接口(interface)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33529178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com