下面是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表达
() -> new WebApplicationException(new ResponseEntity<>(
ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND))发布于 2017-05-09 15:30:08
好吧,如果它是供应商,只需做以下几件事:
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));
}在您的可选电话中,您可以只需编写如下内容:
.orElseThrow(YourClass::myReusableException);编辑:--如果您想将一个变量传递给它,我将使用方法变量并将其更改为:
static Supplier<WebApplicationException myReusableException(T featureKey) {
return () -> new WebApplicationException(.... featureKey);
}并把它当作:
.orElseThrow(myReusableException(currentFeatureKey));正如您所看到的,使用返回值可能会导致有趣的结果。您也可以使用Function<T, Supplier<WebApplicationException>>,但我认为很快就会变得一团糟。为了完成任务,我将添加一个Function-variant,而不返回Supplier
Function<T, Exception> yourReusableFunction = featureKey -> new WebApplicationException(.... featureKey); // where T is the type of featureKey称之为:
.orElseThrow(() -> yourReusableFunction.apply(currentFeatureKey));发布于 2017-05-09 15:30:43
简单地说:
Supplier<Exception> excSupplier = () -> new WebApplicationException(new ResponseEntity<>(
ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND));然后,您可以在任何需要的地方使用excSupplier。
发布于 2017-05-09 15:37:38
以下是如何做到这一点,不仅是在这种特殊情况下,而且一般情况下。
正如您可能知道的,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));https://stackoverflow.com/questions/43873910
复制相似问题