2017-02-09 19 views
8

Учитывая следующий пример классов данных:Почему 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 или я?)

+0

Я также пробовал следующее, поскольку это имело смысл в моей голове, очевидно, что оно не скомпилировалось: Страна :: getRegions :: stream – Lukas

+2

Я согласен, что 'flatMap' должен принимать коллекцию, но я не уверен, что SO чтобы быть в состоянии дать окончательное объяснение, кроме «люди, которые его писали, не писали так». – khelwood

+0

«no» также может быть ответом :) – Lukas

ответ

14

Техническая причина, которая не идеальна, но может быть, почему это wasn Сделано. Вы не можете перегружать общий тип Java.

Они должны поддерживать

Stream.flatMap(Function<Object, Stream<X>> function) 

, что означает, что они не могут перегружать его с

Stream.flatMap(Function<Object, Collection<X>> function) 

, как эти два метода имеют одинаковую сигнатуру после стирания.

Они могли бы добавить метод

Stream.flatMapCollection(Function<Object, Collection<X>> function) 

или

Stream.flatMapIterable(Function<Object, Iterable<X>> function) 

Stream.flatMapI(Function<Object, Iterable<X>> function) 

, но это не было бы довольно.

+0

Да, если эти методы были добавил, что это будет улучшение. – khelwood

+2

@khelwood это может быть не короче. В идеале они добавили бы поддержку разреженных типов и перегрузку на дженериках. –

+1

Этот ответ на самом деле удовлетворяет.Вернее, это дает достоверное объяснение. Спасибо – Lukas

 Смежные вопросы

  • Нет связанных вопросов^_^