Цеповые методы для преобразования из Optional-> List-> List в Java

У меня есть Optional объект, содержащий список. Я хочу сопоставить каждый объект в этом списке с другим списком и вернуть полученный список.

То есть:

public List<Bar> get(int id) {
    Optional<Foo> optfoo = dao.getById(id);
    return optfoo.map(foo -> foo.getBazList.stream().map(baz -> baz.getBar()))
}

Есть ли чистый способ сделать это без потоков в потоках?

Я думаю, что flatMap может быть решением, но я не могу понять, как его использовать здесь.

Ответ 1

Нет. flatMap в случае Optional - это сгладить возможный Optional<Optional<T>> в Optional<T>. Так что это правильно.

public List<Bar> get(Optional<Foo> foo) {
     return foo.map(x -> x.getBazList()
                          .stream()
                          .map(Baz::getBar)
                          .collect(Collectors.toList()))
               .orElse(Collections.emptyList());
}

Ответ 2

Подход Java 9 будет следующим:

public List<Bar> get(Optional<Foo> foo) {
         return foo.map(Foo::getBazList)
                   .stream()
                   .flatMap(Collection::stream)
                   .map(Baz::getBar)
                   .collect(Collectors.toList());
}

Тем не менее, следует избегать использования Optional в качестве параметров, смотрите здесь.