Лямбда Java8 для проверки двух условий

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

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

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

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

Может ли кто-нибудь помочь мне с этим

какова подпись метода ресурса/службы, который вы используете? Ожидаются ли различные списки, и любой из них будет null обязательным?

Naman 27.05.2019 16:36

@Naman это недействительная функция .... Позже я использую response для некоторой другой бизнес-логики в той же функции.

Alex Man 27.05.2019 16:37

На самом деле было бы лучше, если бы вы могли обновить вопрос с помощью метода и объектов, которые рассматриваются в сегменте кода, которым вы делитесь.

Naman 27.05.2019 16:50

прекратите впихивать все в опции (которые, кстати, в основном предназначены для использования в качестве более четкого типа возврата в вашем API) и лямбда-выражения

Coderino Javarino 27.05.2019 16:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
1 095
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете иметь другой 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;

Спасибо за ответ, но мне нужно вернуться к ответвлению из блока потока управления и выйти из метода, если оба условия catList или dogList не совпадают

Alex Man 27.05.2019 16:45

@AlexMan Я изменил ответ, боюсь, это невозможно в одной цепочке вызова метода.

Yassin Hajaj 27.05.2019 16:48

также как мы устанавливаем animalType во втором варианте, используя Stream.of

Alex Man 27.05.2019 16:52

@AlexMan Делая метод универсальным. Например, if (list.get(0) instanceof Dog) animalType = AnimalType.DOG;

Yassin Hajaj 27.05.2019 16:57

в таком случае я думаю первый вариант правильнее

Alex Man 27.05.2019 16:59

@AlexMan Да, я бы предпочел первый вариант, если только для двух списков, если может появиться больше списков, я бы выбрал второй и реорганизовал свой код.

Yassin Hajaj 27.05.2019 17:00

Я получаю исключение, когда использую первый вариант, подобный этому Error:(40, 21) java: incompatible types: no instance(s) of type variable(s) U exist so that java.util.Optional<U> conforms to com.example.demo.Cat

Alex Man 27.05.2019 17:06

Давайте продолжить обсуждение в чате.

Yassin Hajaj 27.05.2019 17:07

Невозможно выйти из метода, использующего 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 (или, опять же, способ Нулевой объект) может использоваться там, где есть метод, вызываемый по адресу:

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

Но как насчет dogList и animalType

Alex Man 27.05.2019 23:44

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

Alex Man 27.05.2019 23:56

Другие вопросы по теме