ストリームの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
を与えます。
があるにISNこれを行うより良い方法になるだろう。元のラムダはあなたが得る最高のものです。 –
あなたが最終的になるすべての答えは、ラムダ式よりも長く、頑丈で、再現性がありません。なぜあなたは別の方法を使いたいのですか? – Tunaki
私はこの質問のこの特定の構成において、少なくともこれを好奇心から探っています。私が提供した2つの例(動作しないもの)でも、ラムダよりも読みにくく、読みにくいです。しかし、メソッドの構成は、可能ならば、もっと頻繁に使用する強力な機能です。あなたのどちらかがなぜこれが許されないのかを説明できる場合、さらにどのような場合にメソッドの構成を使用できるか(たとえば、すべてのメソッドが静的であれば可能でしょうか?)、それは非常に有用であり、私の意見で答えてください。いずれにしてもありがとう! –