![](/img/trans.png)
[英]Reading from a file and writing it back to a file in java(Having trouble understanding BufferedWriter write method in java)
[英]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()
方法。
這里的i1
和i2
到底是什么? 它們是數組還是整數?
為什么我們不寫(int i1, int i2)
? 這是因為我們后來已經提到了Integer嗎?
我知道 Arrays.sort() 按升序對數組進行排序,第二個參數應該是它對數組進行排序的范圍。
那是不正確的。 當您閱讀javadocs 時,您可以看到第二個參數是一個 Comparator - 定義數組應該如何排序的“規則”的方法。
int[][]
是一個整數數組。 如果您采用其中的單個元素,它將是 int 的普通數組 - int[]
。 那就是您要在 sort 方法中比較的元素,這就是i1
和i2
含義。 但那些只是在 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 的兩個數組i1
和i2
。 Integer.compare(i1[0], i2[0])
正在根據它們的第一個元素比較大小為 2 的兩個數組。
sort
方法是通用方法,定義如下:
public static <T> void sort(T[] a, Comparator<? super T> c)
如您所見,在方法調用期間推斷出 Comparator c
實現的類型,並且因為在您的情況下, intervals
是數組中的數組, i1
和i2
的預期類型將為int[]
Arrays.sort
將Comparator<T>
作為第二個參數。
Comparator<T>
是一個接口,它的實現將采用兩個<T>
類型的元素並確定哪個元素在前。 因此,當您需要對非原始類型(如int
、 char
等)的元素進行排序時,實現Comparator
接口非常有用。
在這種情況下,需要通過Arrays.sort
排序的元素不是基元而是其他兩個元素的數組,因此無法對它們進行排序,需要知道如何排序。 所以這就是它提供Comparator
實現作為第二個參數的原因。
您會看到 lambda 正在采用數組i1
和i2
,並通過其第一個元素ix[0]
將它們進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.