2017-06-02 2 views
2

これはどのように動作するかを試しています。
私は何が起こっていると考えているかを列挙し、誰かが私が場所が間違っていると私に言うことができることを願っています。また、どのように/なぜこれが機能するかを教えてください。ラムダ関数がBiConsumerに変換される

public BiConsumer<List<T>, T> accumulator() { 
    return List::add; 
} 
  1. 何も受け付けず、BiConsumer方法を返すアキュムレータと呼ばれる方法。
  2. accumulatorT取り込み、List上の実際のadd方法が実際Function<T, Boolean>あるBiConsumer
  3. としてListの文脈でadd方法に参照を返すブール

を返しますこれが私が推測の世界に入る場所です。

  • それはBiConsumerの第1引数であるListのインスタンスに、addメソッドを呼び出しています。
  • 私は内部で行う必要があることを知っています。

    public BiConsumer<List<T>, T> accumulator() { 
        return (list, item) -> list.add(i); 
    } 
    

    は、私はそれがaddメソッドの戻り値の型を無視することができることを理解し、それはFunction<A, B>Consumer<A>

    であるふりをすることができますしかし、私はちょうどBiConsumerが実行変わる黒魔術を理解していませんBiConsumerの最初の引数のインスタンス上のConsumerまたはFunctionです。

    答えて

    1

    黒い魔法ではありません。それはよく指定されているhereです。

    以下は、特定のタイプの任意のオブジェクトのインスタンスメソッドへの参照の一例である:

    String[] stringArray = { "Barbara", "James", "Mary", "John", 
        "Patricia", "Robert", "Michael", "Linda" }; 
    Arrays.sort(stringArray, String::compareToIgnoreCase); 
    

    方法基準String::compareToIgnoreCaseの等価ラムダ式は仮パラメータ・リスト(String a, String b)を有するであろうここでaとbはこの例をよりよく説明するために使用される任意の名前です。メソッド参照はメソッドa.compareToIgnoreCase(b)を呼び出します。

    あなたがSomeType::instanceMethodのようなものを持っている

    が、それは二つの引数を受け取る関数に変換することができ、例えばある第1は、上のメソッドを呼び出します。ただ とすることができます。

    +0

    したがって、 'Function'メソッドは' BiFunctions'と 'BiConsumers'に変換できます。知っておいてよかった。 – WORMSS

    +0

    @WORMSS私の答えがあなたの質問に答えると思うなら、それを受け入れることを検討してください! – Sweeper

    +0

    あなたの答えは '言語スペックがそう言っていたからです.' ..最高ではありませんあなたの答えは私には分かりませんでしたが、正確には最良の答えではありません。それに加えてください。 – WORMSS

    関連する問題