簡體   English   中英

無法理解 Java 8 中的以下 Lambda 方法

[英]Having trouble understanding the following Lambda method from Java 8

這個 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嗎?

我知道 Arrays.sort() 按升序對數組進行排序,第二個參數應該是它對數組進行排序的范圍。

那是不正確的。 當您閱讀javadocs 時,您可以看到第二個參數是一個 Comparator - 定義數組應該如何排序的“規則”的方法。

int[][]是一個整數數組。 如果您采用其中的單個元素,它將是 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[]> Comparator<? super int[]> 因此,lambda 的參數也是int[]

第二個參數是用於對數組進行排序的比較器。 您嘗試排序的數組是一個二維數組,因此您需要提供一個比較器來對大小為 2 的數組進行排序。

使用此 lambda 表達式,您將比較大小等於 2 的兩個數組i1i2 Integer.compare(i1[0], i2[0])正在根據它們的第一個元素比較大小為 2 的兩個數組。

sort方法是通用方法,定義如下:

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

如您所見,在方法調用期間推斷出 Comparator c實現的類型,並且因為在您的情況下, intervals是數組中的數組, i1i2的預期類型將為int[]

Arrays.sortComparator<T>作為第二個參數。

Comparator<T>是一個接口,它的實現將采用兩個<T>類型的元素並確定哪個元素在前。 因此,當您需要對非原始類型(如intchar等)的元素進行排序時,實現Comparator接口非常有用。

在這種情況下,需要通過Arrays.sort排序的元素不是基元而是其他兩個元素的數組,因此無法對它們進行排序,需要知道如何排序。 所以這就是它提供Comparator實現作為第二個參數的原因。

您會看到 lambda 正在采用數組i1i2 ,並通過其第一個元素ix[0]將它們進行比較。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM