Учитывая следующий пример классов данных:Почему Stream.flatMap не может принимать коллекцию?
class Country {
List<Region> regions = new ArrayList<>();
List<Region> getRegions() {
return regions;
}
}
class Region {
String getName() {
return "some name";
}
}
Предположив Я бы список стран
List<Country> countries = new ArrayList<>();
И я хотел Стрим тех своих регионов и их соответствующие имена я хотел бы сделать следующее:
countries.stream().flatMap(Country::getRegions).map(Region::getName)...
Однако этот код не компилируется, так как возвращаемое значение «getRegions» является коллекция (List), в отличие от Stream, который принимает метод FlatMap. Но так как я знаю, что любая коллекция может быть передана через свой метод Collection.stream(), который не должен быть проблемой. Тем не менее я вынужден написать это следующим образом:
countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)...
Который (с учетом более богатого контекста) гораздо менее читабельным, чем первый.
Вопросы есть, есть ли какая-то причина, что я упускаю, для того, чтобы это было громоздким? У меня есть много примеров в наших рамках, когда я вынужден идти по этому маршруту, всегда оставляя меня с кислым вкусом. (Угадай, мне просто нужно добавить Котлина в наши проекты и расширить класс Stream с помощью метода FlatMap, который принимает коллекцию: p или я?)
Я также пробовал следующее, поскольку это имело смысл в моей голове, очевидно, что оно не скомпилировалось: Страна :: getRegions :: stream – Lukas
Я согласен, что 'flatMap' должен принимать коллекцию, но я не уверен, что SO чтобы быть в состоянии дать окончательное объяснение, кроме «люди, которые его писали, не писали так». – khelwood
«no» также может быть ответом :) – Lukas