Java8 лямбда для проверки двух условий - PullRequest
2 голосов
/ 27 мая 2019

У меня есть следующий фрагмент кода, который я бы попытался изменить на лямбда-функцию.

if(catList != null && catList.size() > 0) {
    animalType = AnimalType.CAT;
    HttpEntity<List<?>> request = new HttpEntity<>(catList, headers);
    response = restTemplate.postForObject(apiUrl, request, String.class);
} else if(dogList != null && dogList.size() > 0) {
    animalType = AnimalType.DOG;
} else {
    return;
}

Как-то я написал так, как показано ниже, но не знаю, чтобы включить dogList проверка состояния

Optional.of(catList) 
    .map(catList -> {
        ....
    })
    .orElse(return); //<------ THIS IS NOT POSSIBLE

Может кто-нибудь, пожалуйста, помогите мне с этим

Ответы [ 2 ]

3 голосов
/ 27 мая 2019

Вы можете иметь другой Optional внутри первого Optional

Optional o = Optional.of(catList) 
                     .map(catList -> ...)
                     .orElse(Optional.of(dogList)
                                     .map(dogList -> ...));

или другой метод, использующий Stream, если вы можете сделать вызов к услуге достаточно универсальным

Или другой метод, использующий Stream#of

Он будет в основном проходить по обоим спискам, находить первый, который не равен нулю (но вы можете добавить другие условия к вашему фильтру, если хотите) и применять общий вызов к сервису.

Optional o = Stream.of(catList, dogList)
                   .filter(Objects::nonNull /*or other condition if you want*/)
                   .findFirst()
                   .map(list -> /*generic call to service*/);

И вызвать его таким образом

if (!o.isPresent()) return;
1 голос
/ 28 мая 2019

Невозможно выйти из метода, используя Optional или любой другой класс, без явного вызова return или исключения.Использование return внутри лямбда-выражения понимается в рамках метода, реализованного в функциональном интерфейсе, поэтому нет шансов сделать так, как показано в коде.

Существует два основных способа достижения желаемогоповедение и соблюдение языка Java.

  1. Используйте return после получения окончательного результата от Optional.

    Здесь я мог бы повторитьсуществующий ответ, но лучшее, что вы можете сделать, это:

    Optional<MyObject> optional = Optional.of(catList) 
        .map(catList -> new HttpEntity<>(catList, headers))
        .map(httpEntity -> restTemplate.postForObject(apiUrl, request, String.class));
    
    if (!optional.isPresent()) { return; }           // here the method execution is terminated
    

    Проверка по null или Нулевому объекту также может быть хорошим вариантом.

  2. Сгенерировать исключение с помощью Optional::orElseThrow позволяет методу завершить метод и сгенерировать Exception.К сожалению, это обязывает верхний слой с необходимостью обращаться с ним или отбрасывать).

    MyObject myObject = Optional.of(catList) 
        .map(catList -> new HttpEntity<>(catList, headers))
        .map(httpEntity -> restTemplate.postForObject(apiUrl, request, String.class))
        .orElseThrow(MyObjectException::new);        // here the method execution is terminated 
    

Если возвращаемый параметр метода не void, Optional может использоваться для определения возвращаемого типа.Проверка null (или снова Null Object - это способ) может быть использован, есть метод, вызываемый по адресу:

 return Optional.of(catList) 
        .map(catList -> new HttpEntity<>(catList, headers))
        .map(httpEntity -> restTemplate.postForObject(apiUrl, request, String.class))
        .orElse(null);
...