Android Kotlin不能在lambda中使用list.sort()

有一个字符串列表,用于过滤直接使用lambda表达式

val list= ArrayList<String>() list.add("eee") list.add("888") list.add("ccc") list.filter({it.length > 0}) // this passing function works too list.filter(fun(it) = it.length > 0) 

它被定义为采用lambda函数类型: (T) -> Boolean

 public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> { return filterTo(ArrayList<T>(), predicate) } 

但类似的语法不适用于sort() 。 它要求使用sortWith来代替。 不明白为什么不能直接在filter()调用中传递lambda表达式。

有人可以解释为什么sort()不能直接使用lambda函数的类似语法?

 list.sort({ first: String, second: String -> first.compareTo(second) }) 

list.sort定义如下,同样采用lambda函数: (T, T) -> Int

 public inline fun <T> MutableList<T>.sort(comparison: (T, T) -> Int): Unit = throw NotImplementedError() 

但它给错误“ 使用排序((T,T) – > INT):单元是一个错误使用sortWith(比较器(比较)),而不是

sort()sortWith()在定义中具有相同的Unit返回类型

对于sortWith()它必须通过比较器,如:

 list.sortWith(Comparator { first, second -> first.compareTo(second) }) 

其定义如下:

 @kotlin.jvm.JvmVersion public fun <T> MutableList<T>.sortWith(comparator: Comparator<in T>): Unit { if (size > 1) java.util.Collections.sort(this, comparator) } 

此外,Arrays.sort可以使用与filter()相同的语法,并直接使用lambda函数

 var listStr = TextUtils.join(", ", list); Arrays.sort(arrayOf(listStr)) { first: String, second: String -> first.compareTo(second) } 

Arrays.sort被定义为:

 public static <T> void sort(T[] a, Comparator<? super T> c) { throw new RuntimeException("Stub!"); } 

因为sort已被弃用,并被标记为DeprecationLevel.ERROR

 @Deprecated("Use sortWith(Comparator(comparison)) instead.", ReplaceWith("this.sortWith(Comparator(comparison))"), level = DeprecationLevel.ERROR) @JvmVersion @kotlin.internal.InlineOnly @Suppress("UNUSED_PARAMETER") public inline fun <T> MutableList<T>.sort(comparison: (T, T) -> Int): Unit = throw NotImplementedError() 

这就是为什么你得到一个错误,编译器要求使用sortWith