我想模拟一个可选的.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