链接选项



我有下面的类Subcontractor和一个名为ResultUtils的Utils类。

Utils方法之一计算分包商的最近一个营业年度。此方法必须返回一个Optional Double,因为可能是在当年新添加了一个分包商。因此,它没有关于过去两年的统计数据。如果一年前增加了分包商,它会有上一个营业年度的统计数据,但不会有倒数第二个营业年度。

我的问题是正确地链接getLatestResult方法。在我的例子中,ifPresentOrElse当然是错误的,因为它不能返回任何值。

我该怎么做?

public class Subcontractor
{
BusinessYear lastBusinessYear;
BusinessYear penultimateBusinessYear;
...
}

public class ResultUtils
{
public static Optional< Double > getLatestResult( Subcontractor )
{
// how to do it right here?
getResult( Subcontractor.getLastBusinessYear()  )
.ifPresentOrElse( r -> return r,
() -> return getResult( Subcontractor.getPenultimateBusinessYear() ) );
}
public static Optional< Double > getResult( BusinessYear businessYear )
{
if( businessYear == null ) return Optional.empty();
// make some calculations
return Optional.of( calculcatedResult );
}
}
public static Optional<Double> getLatestResult(Subcontractor subcontractor) {
return getResult(subcontractor.getLastBusinessYear())
.or(() -> getResult(subcontractor.getPenultimateBusinessYear()));
}

假设您运行的是Java 9+。

ifPresentOrElse将打开可选项,但仍需要返回一个。

  1. 尝试getResult(subcontractor.getLastBusinessYear())
  2. 如果存在,请将其退回
  3. 如果不存在,则返回另一个getResult(subcontractor.getPenultimateBusinessYear())

Java 8解决方案将是

public static Optional<Double> getLatestResult(Subcontractor subcontractor) {
Optional<Double> result = getResult(subcontractor.getLastBusinessYear());
return result.isPresent() ? result : getResult(subcontractor.getPenultimateBusinessYear());
}

让我们修复代码:

public static Optional<Double> getLatestResult(Subcontractor sub) {
return getResult(sub.getLastBusinessYear()).or(() -> getResult(sub.getPenultimateBusinessYear()));
}

您有两个函数,它们都返回一个Optional。您只需要具有值的第一个。如果Optional.or没有值,它会调用供应商,否则它会返回自己。

如果你使用Java 8,那么。。。

public static Optional<Double> getLatestResult(Subcontractor sub) {
Optional<Double> result = getResult(sub.getLastBusinessYear());
if (result.isPresent())
return result;
return getResult(sub.getPenultimateBusinessYear());
}

获取第一个结果,检查是否存在,如果存在,返回。
如果不存在,返回第二个结果。

最新更新