java - 进一步解释 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 方法呢?
这整个想法对我来说没有意义。你能进一步解释一下吗?
解决方案
由于getLastName()
是一个实例方法(=未声明为静态),我们必须指定应该在哪个实例上调用该方法。
对于方法参考,这可以通过两种不同的方式完成:
- 我们可以在构造方法引用时提供对象,通过编写
person::getLastName
,它是 的简写() -> person.getLastName()
。 - 或者我们可以通过编写将其推迟到方法引用的调用者
Person::getLastName
,这是 的简写(person) -> person.getLastName()
。由于此 lambda 接受 aPerson
并返回 aString
,因此它与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())
这就是我们需要keyExtractor
forc1
和的原因c2
:我们想将 的姓氏c1
与 的姓氏进行比较c2
。
推荐阅读
- python - 计算熊猫中列滞后值的日志
- windows - 如何使用 Wamp Server 和 Java 设置 LDAP 服务?
- javascript - window.onclick 在我单击按钮后立即触发
- ajax - 使用 ajax 向 Laravel 控制器发送数据
- javascript - 如何从firebase实时数据库中获取随机密钥的子级数据 - 使用本机反应?
- r - 如何获取数据框中的行索引列表?
- ruby-on-rails - 将数据从 Rails 视图传递到 Rails 6 中的反应组件的首选方法是什么?
- java - 如何在方法中使用通用有界参数
- python - 如何选择性地从 div 标签中抓取 href?
- python - 从静态/img 获取图像到 Django 中的模板