Цеповые методы для преобразования из 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
в качестве параметров, смотрите здесь.