Java:如何使用方法引用在可选的ifPresent中抛出异常,或者在ifPresent内使用可运行程序



我想模拟一个可选的.ifPresentThrow((来使用一些东西,比如:

.ifPresent(MyException::go)

并且不使用:

.ifPresent(e -> {
throw new MyException();
})

所以我用go方法创建了我的类:

class MyException extends RuntimeException {
static void go() {
throw new MyException();
}
}

它不起作用,因为ifPresent希望接收消费者x->((,不是可运行的((->((

在函数中添加一些param,我会得到一个未使用的param。

最好的方法是什么?

正如您已经理解的,函数接口不匹配-ifPresent()需要Consumer<? super T>。但是MyException::go不是消费者,因为go()不接受任何参数。

要修复它,您需要更改go():的方法签名

public class MyException extends RuntimeException {
static void go(Object o) {
throw new MyException();
}
}

注意:这只是一个伪示例。

通常,当您创建自定义异常时,您会想到特定用例,并且这个异常不会像标准异常那样普遍存在(例如,如果您需要创建AuthenticationException的自定义子类,您不会期望它被抛出到应用程序的任何部分,它可能只在验证请求的身份验证数据时发生(。

让我们扩展上面显示的例子。

假设我们有一个域类:

@Getter
public class MyCustomObject {
private String name;
}

MyException被设计用于描述在使用MyCustomObject或其子类时可能发生的异常情况。go()期望的参数可用于将域对象的一些属性合并到异常消息中:

public class MyException extends RuntimeException {
public MyException(String message) {
super(message);
}
static void go(MyCustomObject o) {
throw new MyException(o.getName());
}
}

用法示例:

Stream.of(new MyCustomObject("A"), new MyCustomObject("B"))
.filter(o -> !o.getName().matches("\p{Upper}")) // retain instances having Invalid names
.findFirst()
.ifPresent(MyException::go); // invalid name was found -> throw an Exception with the name included into a message

相关内容

  • 没有找到相关文章