2017-10-16 3 views
8

以下のコードを見てみましょう。ラムダ式がどのように機能インタフェースにマップされますか?

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

そして、単に、その後streams.mapためjavadocを見ていきます。そこで、mapメソッドのシグネチャがこのように表示されます。

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

誰かはJVMがFunction<? super T,? extends R> mapperの面で我々が与えたラムダ式(name -> name.length())をマップする方法を説明していただけますか?

+2

達成しようとしていることは何ですか? Stream型のローカル変数を作成する必要はありません。 'names.stream()。map(...)。collect(Collectors.toList())'を探していますか?また、生のList型は使用しないでください。 – Michael

+0

@Michael実際に私はラムダ表現部分に焦点を当てるために視聴者を必要としました。だから私はあなたが言及した後者の追加を追加しませんでした。これはラムダを機能的なインターフェイスにマッピングすることを理解するためのものです。他に何もない。 :)) –

+1

@マイケルはあなたの意見を持っていました。ありがとうございました。 :))私はコードを修正したいと思っています。 –

答えて

8

FunctionXとなり、Yを返します。あなたは、単一の抽象メソッドをオーバーライドR apply(T t)@FunctionlInterface Function<T,R>を実装しているname -> name.length()と基本的に

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

Functionから

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

チェックapply方法:あなたはまた、メソッド参照していることを短縮することができます

R apply(T t); 

? extends R? super TFunctionクラスとしてタイプ

を取られ、戻り値の型であります非デフォルトのpublicメソッドを1つしか持たない場合、それはcあなたのラムダをFunctionにマップする

関連する問題