我如何解释方法compare(Function<?superT,?extendsU>keyExtractor)的参数?

方法的完整签名:

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
            Function<? super T, ? extends U> keyExtractor)

我正在学习 lambda 表达式,我有这段代码比较员工列表并按姓名字段对它们进行排序:

List<Employee> employees = new ArrayList<>();

Collections.sort(employees, Comparator.comparing(Employee::getName));

该代码工作正常,但我查看了文档中的 Comparator 功能接口,并且找到了方法“比较()”的签名。

comparing(Function<? super T,? extends U> keyExtractor)

我没有得到比较()的参数。我怎么知道参数接受 lambda 表达式?以及如何解释约束:<? 超级T,?扩展 U> keyExtractor?

我知道 super 是什么意思?在层次继承中必须是类型 T 或以上,并且 ? 在层次继承中也必须是 U 类型及以下类型。但是我们怎么能在我的例子中转述呢?

可以这样解释: ? 继承链中必须是Employees及以上类型,并且继承链中name字段必须是Employees或以下类型?或者 ?必须是类型 Array List 及以上和 ? 必须是类型员工列表及以下?

回答

我怎么知道参数接受 lambda 表达式?

通过查看interface它接受的参数的 。在这种情况下,参数类型是Function,它是一个功能接口(这个名称实际上与接口名称没有任何联系 - 您可以随意命名您的接口)。甲功能接口是一个interface仅具有一个未实现功能(附加区分来自一个事实,即interfaceS可具有default实现)。

看看Function

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);

    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

只有一种未实现的方法——它被称为apply. 当您创建一个应该是 a 的Functionlambda 时,该 lambda 的主体将用于实现apply.

您可能对@FunctionalInterface- 这不是必需的感到困惑。这只是为了方便起见的注释。


关于<? super T,? extends U>,这些是对泛型类型的约束。这意味着 saidFunction需要一个作为超类型的参数,T并将返回从U. 这是一个相当复杂的话题。您可以在此处阅读更多相关信息。


以上是我如何解释方法compare(Function&lt;?superT,?extendsU&gt;keyExtractor)的参数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>