首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java-8如何重用lamba表达式

Java-8如何重用lamba表达式
EN

Stack Overflow用户
提问于 2017-05-09 15:26:30
回答 3查看 1.2K关注 0票数 2

下面是lambda表达式存在的方法,我希望它也可以在其他方法中使用,而不需要重复。

代码语言:javascript
运行
复制
    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表达

代码语言:javascript
运行
复制
() -> new WebApplicationException(new ResponseEntity<>(
                    ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-09 15:30:08

好吧,如果它是供应商,只需做以下几件事:

代码语言:javascript
运行
复制
Supplier<WebApplicationException> reusableSupplier = () -> new WebApplicationException(new ResponseEntity<>(
                ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND))

并在需要时重用reusableSupplier

另外,您也可以使用方法引用,其中只有一个返回您想要的异常的方法,例如:

代码语言:javascript
运行
复制
 static WebApplicationException myReusableException() {
   return new WebApplicationException(new ResponseEntity<>(
                   ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND));
}

在您的可选电话中,您可以只需编写如下内容:

代码语言:javascript
运行
复制
.orElseThrow(YourClass::myReusableException);

编辑:--如果您想将一个变量传递给它,我将使用方法变量并将其更改为:

代码语言:javascript
运行
复制
static Supplier<WebApplicationException myReusableException(T featureKey) {
  return () -> new WebApplicationException(.... featureKey);
}

并把它当作:

代码语言:javascript
运行
复制
.orElseThrow(myReusableException(currentFeatureKey));

正如您所看到的,使用返回值可能会导致有趣的结果。您也可以使用Function<T, Supplier<WebApplicationException>>,但我认为很快就会变得一团糟。为了完成任务,我将添加一个Function-variant,而不返回Supplier

代码语言:javascript
运行
复制
Function<T, Exception> yourReusableFunction = featureKey -> new  WebApplicationException(.... featureKey); // where T is the type of featureKey

称之为:

代码语言:javascript
运行
复制
.orElseThrow(() -> yourReusableFunction.apply(currentFeatureKey));
票数 4
EN

Stack Overflow用户

发布于 2017-05-09 15:30:43

简单地说:

代码语言:javascript
运行
复制
Supplier<Exception> excSupplier = () -> new WebApplicationException(new ResponseEntity<>(
  ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND));

然后,您可以在任何需要的地方使用excSupplier

票数 3
EN

Stack Overflow用户

发布于 2017-05-09 15:37:38

以下是如何做到这一点,不仅是在这种特殊情况下,而且一般情况下。

正如您可能知道的,lambda表达式可以用作函数接口类型的值,如ConsumerSupplierFunction等。因此,第一步是确定lambda表达式的类型。在这里,你有:

代码语言:javascript
运行
复制
() -> new WebApplicationException(new ResponseEntity<>(
        ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND))

它不需要参数并返回一个WebApplicationException。由此我们可以推断出它是一个Supplier<WebApplicationException>。另一个例子是,如果您有一个参数并返回void,这将是一个Consumer

在你找出类型之后,你只需要给它起一个名字。之后,您只需声明一个变量的类型和名称,并使用lambda表达式对其进行初始化。就你而言,这是:

代码语言:javascript
运行
复制
Supplier<WebApplicationException> supplier = 
    () -> new WebApplicationException(new ResponseEntity<>(
        ServiceError.of(404, String.format(FEATURE_NOT_FOUND, featurekey)), HttpStatus.NOT_FOUND));

现在,您可以使用这个新变量来代替lambda。只要用你给它起的名字替换lambda表达式就行了。就你而言,这将是:

代码语言:javascript
运行
复制
Feature feature = featureRepository.findByPrimaryKey(featurekey)
        .orElseThrow(supplier);
return Feature.getFeatureView(feature, extractFeatureStatus(feature));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43873910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档