我有以下分包商类和一个名为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 );
}
}
答案 0 :(得分:4)
public static Optional<Double> getLatestResult(Subcontractor subcontractor) {
return getResult(subcontractor.getLastBusinessYear())
.or(() -> getResult(subcontractor.getPenultimateBusinessYear()));
}
假设您在Java 9+上运行。
ifPresentOrElse
解开可选选项,而您仍需要返回一个。
getResult(subcontractor.getLastBusinessYear())
。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());
}
答案 1 :(得分:1)
让我们修复代码:
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());
}
获取第一个结果,检查是否存在,如果存在,则将其返回。
如果不是,则返回第二个结果。