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 тип возвращаемого значения, что не относится к функции отображения.

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