Java 8: разница между map и flatMap для стиля проверки на ноль
Например у меня есть два модельных класса:
public class Person {}
public class Car {}
Теперь у меня есть метод, который принимает 2 необязательных параметра:
public void example1(Optional<Person> person, Optional<Car> car) {
if (person.isPresent() && car.isPresent()) {
processing(person.get(), car.get());
}
}
Теперь я не хочу использовать нулевую проверку, как это, я использую flatMap
а также map
,
person.flatMap(p -> car.map(c -> processing(p, c)));
person.map(p -> car.map(c -> processing(p, c)));
так что мой вопрос: есть ли различия по 2 выше использования? Потому что я думаю, что это то же самое: если одно значение было нулевым, Java прекратит выполнение и вернет.
Спасибо
1 ответ
Разница только в том, что один вернется Optional<?>
а другой вернется Optional<Optional<?>>
(заменить ?
с типом возврата processing()
). Поскольку вы отбрасываете возвращаемый тип, нет никакой разницы.
Но лучше избегать отображающих функций, которые по соглашению должны избегать побочных эффектов, и вместо этого использовать более идиоматические ifPresent()
:
person.ifPresent(p -> car.ifPresent(c -> processing(p, c)));
Это также работает, если processing()
имеет void
тип возвращаемого значения, что не относится к функции отображения.