Chaining Optionals >>

问题描述 投票:-3回答:2

我有以下子承包商类和一个名为ResultUtils的实用程序类。

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 );
    }
}

我有以下类Subcontractor和一个名为ResultUtils的Utils类。 Utils方法之一是计算转包商的最新营业年度。此方法必须返回Optional ...

java optional
2个回答
3
投票
public static Optional<Double> getLatestResult(Subcontractor subcontractor) {
    return getResult(subcontractor.getLastBusinessYear())
            .or(() -> 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());
}

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

© www.soinside.com 2019 - 2024. All rights reserved.