Опциональные цепочки - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть следующий класс Subcontractor и класс Utils с именем ResultUtils.

Один из методов Utils вычисляет последний финансовый год для субподрядчика. Этот метод должен возвращать необязательный параметр 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 );
    }
}

Ответы [ 2 ]

4 голосов
/ 16 апреля 2020
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());
}
1 голос
/ 16 апреля 2020

Давайте исправим код:

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

Получите первое результат, проверьте, присутствует ли он, если да, верните его.
Если нет, верните второй результат.

...