使用 Lambda 理解 Comparator.reversed() 中的編譯器錯誤
嘗試使用 lambda 表達式對 User物件清單進行排序時比較器,如:
List<User> userList = Arrays.asList(u1, u2, u3); userList.sort(Comparator.comparing(u -> u.getName()).reversed());
編譯器可能會顯示錯誤指出它無法在 lambda 的 u 變數中找到 getName() 方法。此問題源自於編譯器類型推斷機制的弱點。
要解決此錯誤,我們需要為 lambda 建立目標類型。使用 Comparator.comparing() 進行排序時,lambda 必須採用與清單中的物件類型相同的參數。
在程式碼的第一行中,我們使用方法引用,目標型別從方法參數型別推斷出來,即User。這使得編譯器能夠正確推斷 lambda 中 u 的型別。
但是,在第三行中,我們使用 lambda 表達式而不是方法引用,對 returned() 的呼叫會破壞目標類型推理。編譯器無法將目標類型傳播回接收者,使 u 具有推斷的 Object 類型,該類型沒有 getName() 方法。
要解決此問題,我們可以使用方法引用或在lambda 中明確指定u 的類型,如下所示:
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
這確保編譯器可以推斷lambda 中u 的正確類型,並根據指定成功對清單進行排序比較器。
以上是為什麼 `Comparator.comparing().reversed()` 會導致 Lambda 出現編譯器錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!