【问题标题】:Having trouble understanding the following Lambda method from Java 8无法理解 Java 8 中的以下 Lambda 方法
【发布时间】:2020-10-06 14:22:07
【问题描述】:

这个 Lambda 8 方法出现在 leetcode.com 上的建议答案之一中:https://leetcode.com/problems/merge-intervals/discuss/21222/A-simple-Java-solution

以下是我似乎无法理解的方法:

int[][] intervals = {{8,10}, {1,3},{2,6},{15,18}};

Arrays.sort(intervals, (i1, i2) -> Integer.compare(i1[0], i2[0]));

我知道Arrays.sort() 按升序对数组进行排序,第二个参数应该是它对数组进行排序的范围。

我不明白的是 i1 和 i2 参数以及随后的 Integer.compare() 方法。

i1i2 到底是什么?它们是数组还是整数?

我们怎么不写(int i1, int i2)?是不是因为后面已经提到过 Integer 了?

【问题讨论】:

  • 你可以写(int[] i1, int[] i2),但这不是必须的,因为编译器假定对int[][]进行排序的比较器是Comparator<int[]>

标签: java lambda


【解决方案1】:

我知道 Arrays.sort() 按升序对数组进行排序,第二个参数应该是它对数组进行排序的范围。

这是不正确的。当您阅读javadocs 时,您可以看到第二个参数是一个 Comparator - 方法,该方法定义了有关如何对数组进行排序的“规则”。

int[][] 是一个整数数组。如果你取其中的一个元素,它将是纯整数数组 - int[]。那就是您要在 sort 方法中比较的元素,这就是 i1i2 是什么。但这些只是 lambda 内部使用的变量名称 - 可以是其他任何名称。

Integer.compare(i1[0], i2[0]) 这将获取每个数组的第一个元素并基于该元素进行比较。

我们怎么不写(int i1, int i2)?是不是因为后面已经提到过 Integer 了?

方法定义为public static <T> void sort(T[] a, Comparator<? super T> c)。当您将int[][] 作为第一个参数传递给它时,编译器假定第二个必须是Comparator<? super int[]> 类型。因此,lambda 的参数也是int[]

【讨论】:

    【解决方案2】:

    第二个参数是您用来对数组进行排序的比较器。 您尝试排序的数组是一个二维数组,因此您需要提供一个比较器来对大小为 2 的数组数组进行排序。

    使用这个 lambda 表达式,您可以比较两个数组,i1i2,大小等于 2。 Integer.compare(i1[0], i2[0]) 正在根据第一个元素比较两个大小为 2 的数组。

    【讨论】:

      【解决方案3】:

      sort 方法是 generic method 定义如下:

      public static <T> void sort(T[] a, Comparator<? super T> c)
      

      如您所见,在方法调用期间正在推断 Comparator c 实现的类型,因为在您的情况下,intervals 是数组中的数组,i1i2 的预期类型将是 @ 987654328@

      【讨论】:

        【解决方案4】:

        Arrays.sortComparator&lt;T&gt; 作为第二个参数。

        Comparator&lt;T&gt; 是一个接口,它的实现将采用&lt;T&gt; 类型的两个元素并确定哪个先执行。因此,当您需要对非原始类型的元素(如intchar 等)进行排序时,实现Comparator 接口非常有用。

        在这种情况下,需要按Arrays.sort 排序的元素不是原始元素,而是两个元素的其他数组,所以它无法对它们进行排序,它需要知道如何排序。这就是为什么它提供 Comparator 实现作为第二个参数。

        您会看到 lambda 使用数组 i1i2,并通过其第一个元素 ix[0] 比较它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-01
          • 1970-01-01
          • 2016-09-23
          • 1970-01-01
          相关资源
          最近更新 更多