私はどのようにしてComparator.comparing
関数の働きを理解しようとしています。私はそれを理解するための自分の比較方法を作成しました。Javaラムダからコンパレータへの変換 - 中間表現
private static <T,U extends Comparable<U>> Comparator<T> comparing(Function<T,U> f) {
BiFunction<T,T,Integer> bfun = (T a, T b) -> f.apply(a).compareTo(f.apply(b));
return (Comparator<T>) bfun;
}
この関数の最後の行は例外をスローします。私は
private static <T,U extends Comparable<U>> Comparator<T> comparing(Function<T,U> f) {
return (T a, T b) -> f.apply(a).compareTo(f.apply(b));
}
にこの機能を変更した場合
しかし、それは期待通りにうまく動作します。
ラムダをComparator
に変換できる2番目の試みが使用する中間機能インターフェイスは何ですか?
ラムダが変換する型は、式がそのコンテキストからの型である必要があります。最初の例では、ラムダはそれが割り当てられている変数の型であるため、 'BiFunction'に変換する必要があります。 2番目の例では、ラムダはメソッドの戻り型であるため、 'Comparator'に変換する必要があります。 'BiFunction'と' Comparator'は同じ「形」を持っているので、同じラムダは文脈によってどちらかになることができますが、それらは異なる型であり、互いにキャストするのは失敗します。 –
私はこれをdownvotingしています。品質に関するものではなく、この質問には数多くの監査があり、そのうちの3つが失敗したためです。 –