我如何解释方法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. 这是一个相当复杂的话题。您可以在此处阅读更多相关信息。