Как использовать Java Необязательно, чтобы преобразовать сложное условие if - PullRequest
0 голосов
/ 13 февраля 2019

Рассмотрим следующий класс

Class RequestBodyResource {
    private RequestVariable1 att1;
    private String att2;
    private String att3;
}

У меня есть метод, который должен возвращать false в 2 условиях

  • Если все 3 атрибута объекта RequestBodyResource равны null / empty
  • Если несколько атрибутов не равны нулю

В основном "хотя бы одно" ИЛИ "не более одного"

Код для того же кода равен

public boolean validateExactlyOneRequiredRequestParam(RequestBodyResource request) {

    //The below 3 conditions are to test that only one request is present
    if(StringUtils.isNotEmpty(request.getAtt3()) && null != request.getAtt1()) {
        return false;
    }
    if(StringUtils.isNotEmpty(request.getAtt2()) && null != request.getAtt1()) {
        return false;
    }
    if(StringUtils.isNotEmpty(request.getAtt3()) && StringUtils.isNotEmpty(request.getAtt2())) {
        return false;
    }

    //The below condition is to test that at least one request is present
    if(StringUtils.isEmpty(request.getAtt3()) && null == request.getAtt1() && StringUtils.isEmpty(request.getAtt2())) {
        return false;
    }
    return true;
}

Как использовать Java 8 Необязательно, чтобы этот код был намного легче писать и читать?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Почему бы просто не посчитать?

int count = 0;
if(request.getAtt1() !=null) {
    count++;
}
if(StringUtils.isNotEmpty(request.getAtt2())) {
    count++;
}
if(StringUtils.isNotEmpty(request.getAtt3())) {
    count++;
}

return count == 1;

Версия с Optional (не используйте, она добавлена ​​просто для удовольствия).

    return Optional.ofNullable(request.getAtt1()).map(ignore -> 1).orElse(0)
            + Optional.ofNullable(request.getAtt2()).map(ignore -> 1).orElse(0)
            + Optional.ofNullable(request.getAtt3()).map(ignore -> 1).orElse(0) 
           == 1;

Также это отсутствие проверкипустые строки.

0 голосов
/ 13 февраля 2019

Нет необходимости в Optional здесь как таковом.Если вам просто нужно проверить, присутствует ли хотя бы один из этих атрибутов, вы можете просто проверить его как:

public boolean validateAtLeastOneRequiredRequestParam(RequestBodyResource request) {
    return request.getAtt1() != null 
            || !StringUtils.isEmpty(request.getAtt3()) 
            || !StringUtils.isEmpty(request.getAtt2());
}

Редактировать 1 : для ровно одной проверки , не такой хороший, но более читабельный (ИМХО), чем ваше текущее решение:

public boolean validateExactlyOneRequiredRequestParam(RequestBodyResource request) {
    long countPresentAttribute = Stream.of(request.getAtt2(), request.getAtt3())
            .filter(StringUtils::isNotEmpty)
            .count() + 
            Stream.of(request.getAtt1()).filter(Objects::nonNull).count();
    return countPresentAttribute == 1;
}

Редактировать 2 : Используя Optional и избавляясь от внешней зависимости от StringUtils, вы можете сделать это следующим образом:

public boolean validateExactlyOneRequiredRequestParam(RequestBodyResource request) {
    long countPresentAttribute = Stream.of(
                Optional.ofNullable(request.getAtt1()),
                Optional.ofNullable(request.getAtt2()).filter(String::isEmpty),
                Optional.ofNullable(request.getAtt3()).filter(String::isEmpty))
            .filter(Optional::isPresent)
            .count();
    return countPresentAttribute == 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...