提取 map(...) 调用中的代码

问题描述

我想把示例代码map(...)方法里面的代码提取到单独的一行(现在代码太长,影响可读性):

final Specification<PeriodicInvoice> noFilterClause = Specification.where(null);
Optional<Date> of = ...;

of.map(f -> Specification.<PeriodicInvoice> where((root,query,cb) -> cb.greaterThan(root.<Date> get("fromPeriod"),f)))
            .orElse(noFilterClause);

我不想写一个函数。我想将提取代码内联在 of.map(...) 上方一行。有什么建议吗?

解决方法

您可以将该 lambda 表达式存储在 Function 类型的变量中:

final Specification<PeriodicInvoice> noFilterClause = Specification.where(null);
Optional<Date> of = ...;

Function<Date,Specification<PeriodicInvoice>> mapper = 
    f -> Specification.<PeriodicInvoice> where((root,query,cb) -> cb.greaterThan(root.<Date> get("fromPeriod"),f));
of.map(mapper)
  .orElse(noFilterClause);