2017-10-16 46 views
8

Aşağıdaki kodlara bakalım.Bir lambda ifadesi, işlevsel bir arayüzde nasıl eşlenir?

List<String> names = Arrays.asList("Adam", "Brian", "Supun"); 
    List<Integer> lengths = names.stream() 
           .map(name -> name.length()) 
           .collect(Collectors.toList()); 

Ve sadece o streams.map için javadoc bakacağız. Orada map yönteminin imzası var.

<R> Stream<R> map(Function<? super T,? extends R> mapper) 

birileri JVM Function<? super T,? extends R> mapper açısından verdik lambda ifade ( name -> name.length()) eşler nasıl açıklayabilir misiniz?

+2

Neyi başarmaya çalışıyorsunuz? Akış türünün yerel değişkenlerini oluşturmanız gerekmez. Names.stream() için harita mı arıyorsunuz? (Collectors.toList()) '? Ayrıca, ham Liste türünü kullanmayın. – Michael

+0

@Michael aslında seyircilerin lambda ifade kısmına odaklanmasına ihtiyacım vardı. Bu yüzden bahsettiğiniz ikinci eklemeleri eklemedim. Bu sadece lambda'nın işlevsel bir arayüze eşlenmesini anlamaktır. Başka hiçbir şey. :)) –

+1

@Michael sizin dikkatinizi çekti. Teşekkür ederim. :)) Umarım kodu düzelttim. –

cevap

8

X A alır ve Y döndürür.

? super T  == String 
? extends R == Integer 

temelde name -> name.length() ile size tek soyut yöntem R apply(T t) geçersiz kılma ile @FunctionlInterface Function<T,R> uyguluyoruz.

Ayrıca yöntem referansı ile bu kısaltabilir:

Stream<Integer> lengths = names.stream().map(String::length); 
2

Kontrol Function den apply yöntemi: dönüş tipi

R apply(T t); 

? extends R olduğunu ? super T alınır tip

Function sınıfa olarak yalnızca bir tane varsayılan olmayan public yöntemine sahiptir, c bir harita sizin lambda ne için Function örnek

İlgili konular