- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想了解方法的定义 comparing
比较器类。我会留下一些代码,以防它有助于解释。我正在使用一个名为 Person 的类,它基本上存储姓名和姓氏。可以使用 get 方法检索此数据。
public class Person {
private final String name;
private final String lastname;
public Person(String name, String lastname) {
this.name = name;
this.lastname = lastname;
}
public String getName() { return name; }
//...
}
然后我创建了一个人员列表:
List<Person> list = Arrays.asList(
new Person("Juan", "García"),
new Person("Ana", "Martínez"),
...
);
我一直在测试不同的方法来对这个 Persons 列表进行排序。在其他可能性中,我发现了这个:
list.sort(Comparator.comparing(Person::getName));
我明白这些行的作用。基本上,此列表使用比较器排序,该比较器使用排序键(人名)进行比较。使用对属于 Person 类的 getName 方法的引用来提取此类 key 。
不过,我也喜欢了解幕后发生的事情。我的问题是 comparing
方法。 Java 文档定义了这样的方法:
static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)
特别是,我正在努力处理通用类型定义:<T,U extends Comparable<? super U>>
;以及参数类型的定义:Function<? super T,? extends U>
T
代表比较器类型,而U
代表 key 类型,对吧?所以……为什么U
需要扩展 Comparable<? super U>
,它又使用 U
的任何父类(super class)?
在参数中,该函数使用属于 T
的任何父类(super class)的对象并返回属于 U
的任何子类的对象( <? super T,? extends U>
),但是……为什么呢?
我希望我的疑问是清楚的。另外,对于冗长的解释,我们深表歉意。
最佳答案
我在这里看到三个主要的混淆:
U extends Comparable<? super U>
?这是对 U
的约束(键的类型),指定具体的类型U
可。它说 U
必须具有可比性。有道理,对吧?尖括号中的部分指定“U
可以比作什么?”例如,Comparable<Animal>
意思是“比得上动物”。约束表示“U
必须与 U
的某些父类(super class)型相当”。
您可能想知道为什么它不直接说“U
必须与U
相当”,即U extends Comparable<U>
.这是因为我们试图使我们的方法尽可能灵活,即我们尝试接受尽可能多的不同 U
。尽可能。如果我有一个 Dog
可以与 Animal
进行比较(实现 Comparable<Animal>
),这只狗也可以与另一只狗进行比较是合乎逻辑的 Dog
.然而,由于 Dog
工具 Comparable<Animal>
而不是 Comparable<Dog>
, 它不满足 U extends Comparable<U>
,这就是为什么我们必须使用 U extends Comparable<? extends U>
.
Function
拿? super T
?假设我有一个提取 Object
的 key 提取器,然后我返回它的 toString()
输出作为比较的关键(这是比较不常见的事情,但为了这个例子,请耐心等待 :D)
Function<Object, String> stringExtractor = Object::toString;
现在我想要一个比较动物的比较器。我可以用这个吗 stringExtractor
作为 comparing
的参数?我当然可以:
Comparator<Animal> comparator = Comparator.comparing(stringExtractor);
所有动物都有一个toString
方法,因为它们是 Object
的子类毕竟!这就是为什么关键提取器参数采用采用父类(super class) T
的函数的原因。 - 允许我们传递上述内容。如果是 Function<T, ? extends U>
,我们将无法做到 Comparator.comparing(stringExtractor)
.
同样,我们想要 comparing
处理尽可能多的事情。
Function
返回 ? extends U
?这其实是没有必要的。除非您明确指定 T
和 U
像这样:
Comparator.<Foo, Animal>comparing(Foo::getDog);
是否为Function<? super T, U>
没有区别或 Function<? super T, ? extends U>
.参见 this question更多细节。那个问题是关于 thenComparing
,其签名为 comparing
.
关于Java - Comparator类比较方法的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67069621/
我想知道以下方面的表现: 对比 我的猜测是 class比 CssClass 快因为 .net 可能不会对 class 做任何事情.另一方面,它必须对 CssClass 做一些工作。把它变成clas
我发现 Haskell Data.Vector.*错过 C++ std::vector::push_back的功能。有grow/unsafeGrow ,但它们似乎具有 O(n) 复杂度。 有没有办法在
我有实现了 MVC 模式的 WinForms 应用程序,其中模型从 View (表单)异步运行(backgroundWorker 线程)。 View 订阅了从 Model 引发的几个事件。 现在我需要
我正在尝试创建一个可以与同一类的实例或 String 进行比较的类。 例如,考虑以下内容: public class Record implements Comparable { public
我经常使用 CopyOnWriteArrayList。 线程执行大量读取 线程执行一些写操作 但是,我将在 Collections.synchronizedList() 时使用 线程执行一点读取 线程
CSS 的 WPF 类比是什么 em单位? 最佳答案 这是我做的。创建了一个 MarkupExtension,它根据在 Window 上分配的字体将字体大小转换为 EM。 我要感谢 http://10
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
有关 Microsoft 最近发布的文档 ReactXP目前没有太多关于 RX.Component 类的信息。 这是文档中的示例: class HelloWorld extends RX.Compon
我想用 Objective-C 为我的框架编写单元测试,它是用 swift 编写的。有没有办法从 Objective-C 测试访问框架的内部 API? 最佳答案 如果你有一个类 Foo 并且你想使用内
如何在 Common Lisp 中创建一个连续数字的列表? 也就是说,在 Common Lisp 中,Python 的 range 函数等价于什么? 在 Python 中,range(2, 10, 2
作为我的项目的一部分,我将 cshtml 脚本部分分离到它自己的文件中。除了一行之外,大部分都成功了。最初, View 文件的脚本部分包含以下行: "sAjaxSource": "@Url.Actio
我正在阅读 Android 文档,在 TextUtils 中看到了一些我通常在 String 类中使用的熟悉方法,并且我还发现方法 String.split(String regex) 已被删除,但存
HTML 的类比是什么?用于添加外部 javascript 的标记,将 C# 脚本添加到 XAML? 最佳答案 它的工作方式并不完全相同。您可以使用 Silverlight 的 Javascript
有谁知道用于 Word/Access VBA 的用户中断 Ctrl+Break 的任何处理程序? 有一个非常有用的处理程序 Application.EnableCancelKey = xlErrorH
Swift 4.2 有一个特殊条件 canImport这有助于开发人员检查是否可以在项目中导入模块。它是在 Swift 4.1 中引入的。 现在我正在开发用 Objective-C 编写的 iOS 项
我是一名优秀的程序员,十分优秀!