У меня есть следующий фрагмент кода, который я бы попытался изменить на лямбда-функцию.
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
Может ли кто-нибудь помочь мне с этим
@Naman это недействительная функция .... Позже я использую response
для некоторой другой бизнес-логики в той же функции.
На самом деле было бы лучше, если бы вы могли обновить вопрос с помощью метода и объектов, которые рассматриваются в сегменте кода, которым вы делитесь.
прекратите впихивать все в опции (которые, кстати, в основном предназначены для использования в качестве более четкого типа возврата в вашем API) и лямбда-выражения
Вы можете иметь другой 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
не совпадают
@AlexMan Я изменил ответ, боюсь, это невозможно в одной цепочке вызова метода.
также как мы устанавливаем animalType
во втором варианте, используя Stream.of
@AlexMan Делая метод универсальным. Например, if (list.get(0) instanceof Dog) animalType = AnimalType.DOG;
в таком случае я думаю первый вариант правильнее
@AlexMan Да, я бы предпочел первый вариант, если только для двух списков, если может появиться больше списков, я бы выбрал второй и реорганизовал свой код.
Я получаю исключение, когда использую первый вариант, подобный этому 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
Давайте продолжить обсуждение в чате.
Невозможно выйти из метода, использующего Optional
или любой другой класс, без явного вызова return
или создания исключения. Использование return
внутри лямбда-выражения понимается в рамках метода, реализованного в функциональном интерфейсе, поэтому нет возможности сделать так, как показано в вашем коде.
В основном есть два способа добиться желаемого поведения и сохранить соответствие языку Java.
Используйте 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
или Нулевой объект также может быть способом.
Вызов исключения с помощью 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
Я пытаюсь создать общую лямбда-функцию для обработки как catList, так и dogList вместо дублирования логики.
какова подпись метода ресурса/службы, который вы используете? Ожидаются ли различные списки, и любой из них будет
null
обязательным?