2014-10-05 15 views
5

Listedeki her öğeye bir lambda uygulayabilmenin en idiyomatik mekanizması nedir? ÖrneğinJava 8 Başka bir Listeye geri dönen bir Listeye Lambda uygulamanın deyimsel yolu?

:

List<Integer> listA = ... imagine some initialization code here ... 

List<Integer> listB = listA.apply(a -> a * a); // pseudo-code (there is no "apply") 

/* listB now contains the square of every value in listA */ 

API javadocs kontrol edilip aynı zamanda Apache Commons içine baktı ama bir şey bulamadık.

cevap

10

Bir yardımcı yöntem var @ için Eran cevabı eklemek için Üçüncü taraf bir kütüphane kullanmıyorsanız, güçlü yeni koleksiyonlar kullanabilirsiniz.

// import javaslang.collection.*; 
listB = listA.map(f); 

Bu Java 8 koleksiyonları değişmezdir ve Scala ve Clojure ile karşılaştırılabilir. Lütfen daha fazla here okuyun.

// import static javaslang.API.*; 
// import javaslang.collection.Stream; 
Stream<R> result = For(iterable1, ..., iterableN).yield((e1, ..., eN) -> ...); 

Yasal Uyarı: Ben Javaslang yaratıcısı değilim -

Btw da for-döngüler için sözdizimsel şeker vardır.

+2

Bu, koleksiyonlarda varsayılan bir yöntem olarak uygun olur. –

+0

Tek bir haritalama işleminden daha fazlasını uygulamak istiyorsanız, bu çok verimsizdir. – AjahnCharles

+0

@CodeConfident 'i ve After fonksiyonlarını bu yönteme aktarmadan önce birden fazla işlevi birleştirmek için kullanabilirsiniz. –

21

Sen map ve collect ile Stream kullanabilirsiniz:

listB = listA.stream() 
      .map (a -> a*a) 
      .collect (Collectors.toList()); 
3

çoğu standart yoludur sadece collect them sonunda etmek: harita işlevi gelen dönüşümü tanıtır nasıl

List<Integer> listA = ... imagine some initialization code here ... 
List<String> listB = listA.stream() 
         .map(a -> a.toString()) 
         .collect(Collectors.toList()); 

Not bu durumda, bir dize için tamsayı ve döndürülen liste List<String> türündedir. Dönüştürme harita tarafından gerçekleştirilir ve Liste toplayıcı tarafından oluşturulur.

List<Integer> listB = apply(listA, a -> a * a); 

(Not:. Java 1.8 veya üstü gerektirir)

1

public static <T, R> List<R> apply(Collection<T> coll, Function<? super T, ? extends R> mapper) { 
    return coll.stream().map(mapper).collect(Collectors.toList()); 
} 

olarak kullanılabilir:

İlgili konular