StreamEx
дено следующее в качестве примера классов данных:
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» представляет собой Collection (List), а не Stream, который принимает метод flatMap. Но так как я знаю, что любая коллекция может быть передана через метод Collection.stream (), это не должно быть проблемой. Тем не менее я вынужден написать это следующим образом:
countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)...
Который (учитывая более богатый контекст) гораздо менее читабелен, чем первый.
Вопрос в том, есть ли какая-то причина, по которой я упускаю, чтобы это было настолько громоздко? У меня есть много примеров в нашей структуре, на которых я вынужден пойти по этому пути, всегда оставляя меня с кислым вкусом. (Думаю, мне просто нужно добавить Kotlin в наши проекты и расширить класс Stream с помощью метода flatMap, который принимает коллекцию: p или я?)