アーディティヤグプタ:
以下のようなコレクションの初期化中TreeMap
、TreeSet
などを、私たちは、カスタムのコンパレータを追加することができます。コードは次のようになります。
Map<Integer, String> map1 = new TreeMap<>(new Comparator<Integer>() {
public int compare(Integer x, Integer y) {
return x-y;
}
});
今、私たちは、ラムダ式でこの匿名の実装を置き換えることができます。コードは次のようになります。
Map<Integer, String> map2 = new TreeMap<>((x,y) -> x-y);
Javaの-8はあなたを介して変数にラムダ式を保存することができます機能インタフェース。だから、私は次のように上記のコードを変更しました:
BiFunction<Integer, Integer, Integer> myComparator = (x,y) -> x-y;
Map<Integer, String> map3 = new TreeMap<>(myComparator);
しかし、この最後の試みはうまくいきませんでした!これは、次のエラーが発生しました:
TreeMapのために型引数を推論することはできません。<>
なぜそれが最後の例では解決の種類に失敗したのか?
注:これはIDEのバグではないことを確認するために、私が使用して生のコンパイルを実行しjavac
、それはまだ同じエラーを与えました。
ニコラス:
ラムダ式は同じに見えますが、BiFunction
ではありませんComparator
ので、あなたがそれらを交換することはできません。
Comparator<Integer> comparator = (x,y) -> x - y;
Map<Integer, String> map3 = new TreeMap<>(comparator);
のは、これらのインタフェースに深く見てみると、匿名クラスを使用してそれらを実装してみましょう:
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer x, Integer y) {
return x - y;
}
};
BiFunction<Integer, Integer, Integer> biFun = new BiFunction<Integer, Integer, Integer>() {
@Override
public Integer apply(final Integer x, final Integer y) {
return x - y;
}
};
違いは、メソッドの名前です。TreeMap
期待Comparator
そのコンストラクタでは、内部実装が呼び出されますのでcompare
との契約によるとComparator
。
ところで、BinaryOperator<T>
だけでなく、同じラムダ式で結果。