首页 > 解决方案 > 进一步解释 keyExtractor

问题描述

我正在学习如何Comparator<T>工作。我已经看了一下这个线程。但是我还是有些迷茫...

这里是 Comparator.comparing 的接口

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

下面的陈述给了我一个Comparator<Person>

Comparator<Person> byLastName = Comparator.comparing(Person::getLastName);

假设 person.getLastName 接受 arg 并返回 String。Person::getLastName 不与Function<T, U>应该将 T 作为输入类和 U 作为返回类的接口相加。我最好的猜测是 U 是 String 类。但是T呢?(我知道它应该是 Person,但对我来说没有意义)

以下实现对我也没有任何意义。

(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));

我猜 c1 和 c2 是个人实例。但是为什么我们需要用 c1 类调用 apply 方法呢?

这整个想法对我来说没有意义。你能进一步解释一下吗?

标签: java

解决方案


由于getLastName()是一个实例方法(=未声明为静态),我们必须指定应该在哪个实例上调用该方法。

对于方法参考,这可以通过两种不同的方式完成:

  • 我们可以在构造方法引用时提供对象,通过编写person::getLastName,它是 的简写() -> person.getLastName()
  • 或者我们可以通过编写将其推迟到方法引用的调用者Person::getLastName,这是 的简写(person) -> person.getLastName()。由于此 lambda 接受 aPerson并返回 a String,因此它与Function<Person, String>.

以下实现对我也没有任何意义

(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));

如果 keyExtractor 是Person::getLastName()keyExtractor.apply(c1)则表示c1.getLastName(),并keyExtractor.apply(c2)表示c2.getLastName()。也就是上面的代码意思是

(c1, c2) -> c1.getLastName().compareTo(c2.getLastName())

这就是我们需要keyExtractorforc1和的原因c2:我们想将 的姓氏c1与 的姓氏进行比较c2


推荐阅读