下面是lambda表达式存在的方法,我希望它也可以在其他方法中使用而不会重复。
public FeatureView getFeature(String featurekey) {
Feature feature = featureRepository.findByPrimaryKey(featurekey)
.orElseThrow(() -> new WebApplicationException(new ResponseEntity<>(
ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND)));
return Feature.getFeatureView(feature, extractFeatureStatus(feature));
}
Lamba Expression
() -> new WebApplicationException(new ResponseEntity<>(
ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND))
答案 0 :(得分:4)
好吧,如果是供应商,只需执行以下操作:
Supplier<WebApplicationException> reusableSupplier = () -> new WebApplicationException(new ResponseEntity<>(
ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND))
并在您需要的地方重复使用reusableSupplier
。
或者你也可以使用方法引用,只需要一个方法返回你想要的异常,例如:
static WebApplicationException myReusableException() {
return new WebApplicationException(new ResponseEntity<>(
ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND));
}
在您的Optional-call中,您可以编写如下内容:
.orElseThrow(YourClass::myReusableException);
编辑:如果您想要将变量传递给它,我会使用方法变体并将其更改为以下内容:
static Supplier<WebApplicationException myReusableException(T featureKey) {
return () -> new WebApplicationException(.... featureKey);
}
并使用它:
.orElseThrow(myReusableException(currentFeatureKey));
正如您所看到的那样,使用返回值可能会产生有趣的结果。您也可以使用Function<T, Supplier<WebApplicationException>>
,但我认为很快就会变得混乱。完成后,我将添加Function
- 变体而不返回Supplier
:
Function<T, Exception> yourReusableFunction = featureKey -> new WebApplicationException(.... featureKey); // where T is the type of featureKey
致电:
.orElseThrow(() -> yourReusableFunction.apply(currentFeatureKey));
答案 1 :(得分:3)
简单地:
Supplier<Exception> excSupplier = () -> new WebApplicationException(new ResponseEntity<>(
ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND));
然后,您可以在任意位置使用excSupplier
。
答案 2 :(得分:3)
以下是如何做到这一点,不仅仅是在这种情况下,而是一般。
您可能知道,lambda表达式可以用作功能接口类型的值,例如Consumer
,Supplier
,Function
等。所以第一步是弄清楚什么类型lambda表达式是。在这里,你有:
() -> new WebApplicationException(new ResponseEntity<>(
ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND))
它不需要参数并返回WebApplicationException
。由此,我们可以推断它是Supplier<WebApplicationException>
。另一个例子是,如果你有一个接受一个参数并返回void
的东西,那将是Consumer
。
找出类型后,您只需要给它起一个名字。之后,您只需声明一个具有类型和名称的变量,并使用lambda表达式初始化它。在你的情况下,这个:
Supplier<WebApplicationException> supplier =
() -> new WebApplicationException(new ResponseEntity<>(
ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND));
现在,您可以使用此新变量代替 lambda。只需用你给它的名字替换lambda表达式。在您的情况下,这将是:
Feature feature = featureRepository.findByPrimaryKey(featurekey)
.orElseThrow(supplier);
return Feature.getFeatureView(feature, extractFeatureStatus(feature));