Android Kotlin 不能将 list.sort() 与 lambda 一起使用

标签 android sorting lambda kotlin

有一个字符串列表,对于过滤器,它直接采用 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()

但它给出了错误“using sort((T, T) -> Int) : Unit is an error Use sortWith(Comparator(comparison)) instead

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 的原因。

关于Android Kotlin 不能将 list.sort() 与 lambda 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45846429/

相关文章:

java - startActivity() 之前的操作

java - mapreduce,排序值

java - Java中如何根据比率对两个数组进行排序?

javascript - 将对象字面量转换为排序数组

c++ - 在 C++ 中用什么来表示 lambda 字符

python - 在循环中使用 python 中的柯里化(Currying)函数

java - 为什么我会收到 InvocationTargetException?安卓2D游戏

android - 如何在android中正确调整scrollview的大小

android - 带页面指示器的无尽自动 ScrollView 寻呼机

generics - 如何使用泛型类型参数定义变量?