2017-02-24 93 views
5

Neden Java Koleksiyonlar API'sının farklı koleksiyon türlerinde kullanışlı map yöntemlerini içermediğini merak ediyorum.Java koleksiyonları neden uygun bir harita yöntemi sunmuyor?

List<Foo> list = ...; 
List<String> result = list.stream().map(Foo::toString).collect(toList()); 

bu varsayılan yöntemi de uygulayan kadar kolay olmaz:

List<Foo> list = ...;  
List<String> result = list.map(Foo::toString); 

Bunun yerine bu gibi bir akış oluşturmak harita ve toplamak zorunda: Ben böyle bir şey yazmak istiyorum java.util.List arabirimi? Örneğin.

default <R> List<R> map(Function<E, R> mapper){ 
    return stream().map(mapper).collect(Collectors.toList()); 
} 

İlk bakışta, diğer kolaylıklar yöntemleri yürürlükte gibi görünüyor. Örneğin:

list.stream().forEach(x -> {}); 

Ancak, karşılaştırma iyi değil

list.forEach(x -> {}); 

olarak yazılabilir. Iteratable.forEach, üst düzey arayüzde varsayılan bir yöntemdir ve bir dönüş türü belirtmenize gerek yoktur. Davlumbazın altında bir akış oluşturmuyor, daha çok Iteratables özelliklerini kullanarak ... tüm öğeleri yinelemek.

Soru şu şekilde kalıyor: Neden her bir Koleksiyonlar API arabiriminde bir harita yöntemi yok? Belki de yeterince esnek olmadığından, dönüş türüne karar vermeniz gerekecek?

Uygulayıcıların bunun hakkında düşündüğünden ve nedenleri yerleştirmemeleri için nedenleri olduğundan eminim. Ve nedenini anlamak isterim.

+0

Sadece dört gün önce: ([ “? o' forEach' olduğunda neden 'list 'bir' map' varsayılan yöntemi yoktur”] http://stackoverflow.com/q/42364761/2711488) – Holger

cevap

6

Evet, bu kasıtlı. Ben tartışılan duydum Bazı nedenler: Bu daha etkin olur ki bu durumda

  • defalarca bu yöntemler birlikte zincirleme sadece hesaplama
  • kontrolü mutlak büyüklük sonunda açık bir veri yapısına toplamak arayüzün otomatik tamamlamada vb
  • parallel() gibi özelleşmiş yapılandırma yöntemleri ile tek tutarlı API içine tüm akıcı özelliklerini inşa zaten map adlı yöntemleri sağlanan Collection dış uygulamaları ile
  • önlemek çatışmaları görünen seçeneklerin sayısını yönetmek; ve bu API,
  • üzerinde belirtildiği gibi, bağımsız olarak, dönüş türünün bir uygulamasına açıkça karar vermesine izin veren koleksiyonlardan ayrı olarak geliştirilebilir - Collection ve map üzerinde rastgele bir çağrınız varsa, List veya çıktısını sessiz bir şekilde çıkaran Set olsun ?! süper kafa karıştırıcı olurdu