Java-8如何重用lamba表达式

时间:2017-05-09 15:26:30

标签: lambda java-8

下面是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))

3 个答案:

答案 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表达式可以用作功能接口类型的值,例如ConsumerSupplierFunction等。所以第一步是弄清楚什么类型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));