コンパレータない仕事の代わりにBiFunctionを使用します

アーディティヤグプタ:

以下のようなコレクションの初期化中TreeMapTreeSetなどを、私たちは、カスタムのコンパレータを追加することができます。コードは次のようになります。

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>だけでなく、同じラムダ式で結果。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=197578&siteId=1