Java Lambda 到比较器转换 - 中间表示

我试图理解函数是如何工作的。我创建了自己的比较方法来理解它。Comparator.comparing

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));
}

它按预期工作正常。

第二次尝试使用的中间函数接口是什么,它能够将 lambda 转换为 ?Comparator


答案 1

第二次尝试使用的中间功能接口是什么,它能够将lambda转换为比较器?

本身。Comparator

在第二种方法中,您定义了 一个 ,而不是已强制转换为 的中间对象。ComparatorComparator

此函数中的最后一行将引发异常。

是的,它应该。

如果两个类是功能接口并且具有相似的方法(具有相同的签名和相同的返回类型),这并不意味着它们可以互换使用。


一个有趣的技巧 - 你可以通过参考 的方法做一个:Comparator<T>BiFunction<T, T, Integer> bfunapply

private static <T,U extends Comparable<U>> Comparator<T> comparing(Function<T,U> f) {
    final BiFunction<T,T,Integer> bfun = (T a, T b) -> f.apply(a).compareTo(f.apply(b));
    return bfun::apply; // (a, b) -> bfun.apply(a, b);
}

答案 2

第二次尝试中的中间功能接口很简单:Comparator<T>

您可以看到这一点,因为您的代码片段等效于以下内容:

private static <T,U extends Comparable<U>> Comparator<T> comparing(Function<T,U> f) {
    Comparator<T> comparator = (T a, T b) -> f.apply(a).compareTo(f.apply(b));
    return comparator;
}

推荐