Java Lambda表达式数组.sort

Java Lambda表达式数组.sort,java,sorting,lambda,Java,Sorting,Lambda,我有一个关于Java中Arrays.sort的问题,以及它如何与lambda表达式一起工作 Arrays.sort(logs, (log1, log2) -> { ... either returns -1, 0, 1 } 有人能给我解释一下这个lambda表达式对于返回值是如何工作的吗 如果需要更多信息,请告诉我 编辑:我对比较器有一个非常基本的了解,如果您想解释一下,我将不胜感激。基本上,这将使用lambda表达式作为比较器 比较其两个参数的顺序。返回负整数、零或正整数,因为

我有一个关于Java中Arrays.sort的问题,以及它如何与lambda表达式一起工作

Arrays.sort(logs, (log1, log2) -> { 
   ... either returns -1, 0, 1
}
有人能给我解释一下这个lambda表达式对于返回值是如何工作的吗

如果需要更多信息,请告诉我


编辑:我对比较器有一个非常基本的了解,如果您想解释一下,我将不胜感激。

基本上,这将使用lambda表达式作为比较器

比较其两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个参数。 在前面的描述中,符号sgn(表达式)指定数学符号函数,该函数被定义为根据表达式的值是负、零还是正返回-1、0或1中的一个

有关更多信息,请阅读文档。
比较器是一个对象,它回答了一个问题,即对于给定的顺序,合适类型的对象对如何相互比较。它的
compare()
方法接受两个参数,并报告它们的相对顺序,如果第一个参数在第二个参数之前排序,则返回-1;如果第一个参数在第二个参数之后排序,则返回+1;如果两个参数相等,则返回0

它可以以各种方式使用,但特别是,它可以用于对这类对象的序列进行排序,使用
比较器
代替不适用于大多数类型对象的关系运算符(
,…)。此外,
Comparator
s允许根据任何选择的顺序对对象进行排序,因为对于所有实际意图和目的,选择的
Comparator
实现定义了顺序。这就是
Arrays.sort()
如何使用
Comparators
——提供的
Comparator
充当关系运算符的替身


由于
Comparator
是一个功能接口,因此可以以lambda的形式提供实现。将lambda与
Arrays.sort()一起使用并没有什么新的或不同的地方。它只是
array.sort()
的形式,依赖
比较器来定义顺序,而
比较器通过lambda实现。

您基本上需要了解
比较器是如何工作的。问题中的排序API需要两个输入,一个是要排序的数组,另一个是用于比较元素以确定其顺序的比较器。这应该是一个很好的起点。@Naman想解释一下吗?@Naman我很理解,但是为什么会有一个值的元组呢?例如,我使用数字排序,即a.number-b.number->较大的数字在顺序中被赋予较高的索引值,但对于元组,如果例如两个日志的值为1,是否会发生合并排序来确定它们的顺序?@Naman我想我可能刚刚回答了这个问题。如果发生合并排序,所有值都将相互比较,一个排序中值为1的日志在另一个排序中可以有值0或-1;这是lambda函数的参数列表。排序方法将针对不同的值对(根据需要)重复调用lambda,直到对整个数组进行排序。(编辑:你明白了!)首先,谢谢你的详细解释,我真的很感谢你的帮助。作为另一个问题,我现在对比较器有了更好的理解(作为一个视觉学习者,文档并没有真正为我描绘一幅画面,因为它没有真正深入到it imo的工作中),然后当我使用数组时。排序(整数数组)有一个预定义的比较器一直在对我的整数数组排序。。?(编辑:似乎是这样。使用lambda表达式,您可以更灵活地定义您特别想要的顺序,即它不是升序)到目前为止,对于需要更好理解的人来说,这段视频似乎非常好。@J.Doe,
Arrays.sort()
的版本,它接受
int[]
已针对排序
int
s进行了调整。它使用关系运算符而不是比较器。另一方面,如果您传递一个
整数[]
或实现
可比
的任何其他引用类型的数组,它实质上等同于使用通过
Comparator.naturalOrder()
获得的
比较器
。这很酷。。因此,他们可以识别它是否为基元类型,然后推断是否要使用关系运算符或可比较运算符,并在此基础上为您提供实现自己的排序方式的灵活性。衣冠楚楚的还有一个问题。是否有规则切换-1和1的顺序。例如,o1.compareTo(o2)与o2.compareTo(o1),前者给出升序,后者给出降序?在前者中,负值位于左侧,而在后者中,负值位于右侧?