2016-10-03 10 views
3

ストリームのcollect(Collectors.toMap(..))コールでメソッド参照を作成したいとします。次の例では、私は、メソッド参照せずに自分のタスクを達成するコードがある:ストリームコレクタでのJava 8メソッド参照の作成

class A { 
    private String property1; 
    private B property2; 

    public String getProperty1() { return property1; } 
    public B getProperty2() { return property2; } 
} 

class B { 
    private String property3; 

    public String getProperty3() { return property3; } 
} 

public class Main { 
    public static void Main() { 
     List<A> listOfA = /* get list */; 

     Map<String, String> = listOfA.stream() 
      .collect(toMap(x -> x.getProperty1(), x -> x.getProperty2().getProperty3())); 
    } 
} 

A::getProperty1()x -> x.getProperty1()を変更することは簡単です。しかし、x -> x.getProperty2().getProperty3()ではそれほど簡単ではありません。私は仕事に、次のいずれかをしたいと思います:

.collect(toMap(A::getProperty1, ((Function)A::getProperty2).andThen((Function)B::getProperty3))) 

または

.collect(toMap(A::getProperty1, ((Function)B::getProperty3).compose((Function)A::getProperty2))) 

しかし、どちらも私にエラーNon-static method cannot be referenced from static contextを与えます。

+3

があるにISNこれを行うより良い方法になるだろう。元のラムダはあなたが得る最高のものです。 –

+4

あなたが最終的になるすべての答えは、ラムダ式よりも長く、頑丈で、再現性がありません。なぜあなたは別の方法を使いたいのですか? – Tunaki

+0

私はこの質問のこの特定の構成において、少なくともこれを好奇心から探っています。私が提供した2つの例(動作しないもの)でも、ラムダよりも読みにくく、読みにくいです。しかし、メソッドの構成は、可能ならば、もっと頻繁に使用する強力な機能です。あなたのどちらかがなぜこれが許されないのかを説明できる場合、さらにどのような場合にメソッドの構成を使用できるか(たとえば、すべてのメソッドが静的であれば可能でしょうか?)、それは非常に有用であり、私の意見で答えてください。いずれにしてもありがとう! –

答えて

3

A::getProperty2は、Function<A, B>(つまり、Aのインスタンスを取り、Bのインスタンスを返す関数)です。

あなたはキャストとして、それを構成することができます。

((Function<A, B>)A::getProperty2).andThen(B::getProperty3) 

それとも、のような機能のプロデューサーを作成することができます

public static <A, B, R> Function<A, R> compose(
     Function<A, B> f1, Function<B, R> f2) { 
    return f1.andThen(f2); 
} 

をとして構成するためにそれを使用する:

compose(A::getProperty2, B::getProperty3) 
+1

'A :: getProperty2'は' Function'の有効なメソッド参照であり、 'A'型のパラメータをとるため、' Supplier'としては使用できません。 –

+0

@DidierL、そうです。私の答えを更新しました。 – ericbn

+0

私の間違いは、あなたが明確にしたように、 'Function 'の代わりに 'Function'にキャストしていました。ありがとう! –

関連する問題