有一个字符串列表,对于过滤器,它直接采用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()
.它要求改用排序。不明白为什么不能像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()
但它给出错误"使用 sort((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
的原因。