2017-02-09 119 views
8

veri sınıflarının Örnek olarak aşağıdaki Verilen: Ben Ülkeler Neden Stream.flatMap bir koleksiyonu kabul edemiyor?

List<Country> countries = new ArrayList<>(); 

Listesini olurdu varsayarsak

class Country { 

    List<Region> regions = new ArrayList<>(); 

    List<Region> getRegions() { 
     return regions; 
    } 

} 

class Region { 

    String getName() { 
     return "some name"; 
    } 

} 

Ve ben onların Bölgeler ve isterim ilgili adlar için bu Stream istedi bu kod "getRegions" nin dönüş değeri beri derleme değil Ancak

countries.stream().flatMap(Country::getRegions).map(Region::getName)... 

bir Koleksiyonu: aşağıdakileri yapmak için FlatMap Yöntemi kabul ettiği bir Akışın aksine (Liste). Ancak bildiğimden beri, herhangi bir Koleksiyonun bir sorun olmaması gereken Collection.stream() Yöntemi ile aktarılabileceğini biliyorum. Hala şu şekilde yazmak zorundayım: eskisinden daha

(daha zengin içerik verilmiş) olan
countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)... 

çok daha az okunabilir.

Sorular şu, bu kadar hantal olmak için, kaçırdığım herhangi bir sebep var mı? Bu rotayı almaya mecbur bıraktığımız, her zaman ekşi bir tada sahip olduğum çerçevemize çok sayıda örnek var. (Tahmin et Projemize Kotlin'i eklemem ve Stream sınıfını bir Koleksiyon alan bir flatMap Yöntemi ile genişletmeliyim: p veya yapsam mı?)

+0

Ayrıca kafamda anlamlı olduğu gibi aşağıdakileri de denedim: Ülke :: getRegions :: stream – Lukas

+2

'FlatMap'in bir koleksiyonu kabul etmesi gerektiğine katılıyorum, ancak emin değilim. "Yazmış olan insanlar bu şekilde yazmadılar" dışında kesin bir açıklama yapabilecekler. – khelwood

+0

"hayır" da bir cevap olabilir :) – Lukas

cevap

14

Teknik nedenlerden ötürü ideal değil ama neden bu değildi bitti. Java'da genel bir türe aşırı yüklenemezsiniz.

Onlar bu iki yöntem silinmeye sonra aynı imzaya sahip olarak onlar

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

ile aşırı anlamına gelir

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

desteklemesi gerekir.

Onlar yöntemini ekleyebilirsiniz

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

veya

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

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

ama oldukça olmazdı.

+0

Evet, bu yöntemler kullanılıyorsa ekledi bir iyileştirme olurdu. – khelwood

+2

(khelwood) daha kısa olmayabilir. İdeal olarak, nadir bulunan tipler için destek ve jeneriklerde aşırı yüklenmeler eklerler. –

+1

Bu cevap aslında tatmin edici.Ya da daha ziyade geçerli bir açıklama sağlar. Teşekkürler – Lukas