2016-05-28 3 views
1

Java 8で遊んでいます。メソッドリファレンスを返すにはどうすればよいですか?リターンメソッド参照

ラムダを返すことはできますが、メソッドリファレンスは返すことができません。

私の試み:

public Supplier<?> forEachChild(){ 
    return new ArrayList<?>::forEach; 
} 

OR

public Function<?> forEachChild(){ 
    return new ArrayList<?>::forEach; 
} 

答えて

5

あなたはどのようにmethod-references仕事の小さなミスを理解しています。

まず、newメソッド参照はできません。

次に、何をしたいのかを考えてみましょう。メソッドforEachChildは、ListConsumerを受け入れるものを返すようにします。 Listは、forEachを呼び出すオブジェクトになり、Consumerは、リストの各要素に対して実行するアクションになります。そのためには、BiConsumerを使用できます。これは、2つのパラメータを取り、結果を返さない演算を表します。最初のパラメータはリストで、2番目のパラメータはコンシューマです。

そのようなものとして、次のように動作する:

public <T> BiConsumer<List<T>, Consumer<? super T>> forEachChild() { 
    return List::forEach; 
} 

方法参照このタイプ「は、特定のタイプの任意のオブジェクトのインスタンスメソッドへの参照」と呼ばれます。何が起こるかは、というパラメータとして与えることにより、List<T>の最初のパラメータがforEachが呼び出されるオブジェクトになります。私はいくつかのポイントを追加したいと思い

forEachChild().accept(Arrays.asList("1", "2"), System.out::println); 
1

次に、あなたは次のようにそれを使用することができます。

無制限のタイプのインスタンスをインスタンス化することはできません。あなたは方法が

他の事がある、forEach(Consumer<T> consumer)(パイプラインの流れのための端末の動作)を参照作るとき

List<?> list = new ArrayList<?>(); 

第二には、Tunakiが述べたように、あなたははしていませんnew MyObject::staticMethodへの参照を作成することはできません何かを返す。私たちがそれを食べるものだけを食べます。

-Hopeこれは:)

+0

'新しいArrayListを()'許可されていない、 '一覧リスト=新しいArrayListを<>()しばらく助けるかもしれない;'スムーズに動作しますが、それは問題ではないというだけの理由そのコンテキストで 'new ArrayList ()'または 'new ArrayList ()'のどちらを使うかによって異なります。さらに、新しいオブジェクトのインスタンスメソッド( 'forEach'は' static'ではないことに注意してください)への参照を行うことができます。 'Consumer > c = new ArrayList <>():: forEach;はあまり有効ではありませんが、有効なステートメントです。 – Holger

+0

ええ。あなたは確かに正しいです。 'new ArrayList <>();'は古いJavaの方法です。 Java 1.5より前。 * Genericsが生まれる前* –

+0

** No **。 'new ArrayList <>()'はJava 7以降の方法です。それは以前のバージョンではコンパイルされませんでした。もっと見る。 – Holger