簡體   English   中英

Java 到 Kotlin 使用比較器和對轉換失敗

[英]Java to Kotlin Convert Fail Using Comparator & Pair

我正在嘗試將此代碼從 java 轉換為 Kotlin:

            Comparator.<Pair<String, Integer>, Integer>comparing(Pair::getSecond)
                    .reversed()
                    .thenComparing(Pair::getFirst);

Intellij 指出 Pair 已被棄用。 我正在嘗試找到慣用的 kotlin 方式來寫出這個。 然而,intellij 產生了這個:

companion object {
        private val COUNT_COUNTRY_COMPARATOR = Comparator.comparing { obj: Pair<String?, Int?> -> obj.second }
            .reversed()
            .thenComparing { obj: Pair<String?, Int?> -> obj.first }
    }

這不會編譯錯誤:

Type mismatch.
Required:
TypeVariable(U)!
Found:
Int?

在比較器、已棄用的 Pair 和奇怪的轉換之間,我想知道在 Kotlin 中是否有更好的方法來編寫它。

Java-to-Kotlin 轉換器相當聰明並且非常有用,但它遠非完美; 有時它會生成帶有語法錯誤的代碼,有時(更糟糕的是)可以編譯但行為不完全相同的代碼。 因此,始終值得仔細檢查其 output。

在這種情況下,還有更簡潔和慣用的方式,例如:

compareByDescending<Pair<String, Int>>{ it.second }
    .thenBy{ it.first }

這使用頂級 function compareByDescending()和擴展 function thenBy() ,兩者都采用“選擇器” ZC1C425268E68385D14AB5074C17Z9。

(我發現 lambda 版本比函數參考版本更容易閱讀,但毫無疑問后者也是可能的。)


因為第二個參數是數字,你可以使用簡單的否定來反轉它的順序。 然后它將簡化為:

compareBy<Pair<String, Int>>({ -it.second }, { it.first })

但是,如果任何一對可以具有Int.MIN_VALUE ,那將不起作用,因為您不能否定它(或者更確切地說,它是它自己的否定),因此它仍然會出現在其他所有內容之前。

暫無
暫無

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

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