kotlin - 如何通过在 kotlin 中使用过滤器对列表中的元素进行排序?我的方法有什么问题?
问题描述
val spices = listOf("curry", "pepper", "cayenne", "ginger", "red curry", "green curry", "red pepper" )
spices.filter { it }.sortedBy { it.length }
错误:类型推断失败:inline fun Iterable.filter(谓词:(T)-> Boolean):列表无法应用于接收者:列表参数:((字符串)->字符串)
香料过滤器 { it }.sortedBy { it.length } ^ 错误:类型不匹配:推断类型是(字符串)-> 字符串但(字符串)-> 布尔值是预期的
解决方案
filter
需要一个返回布尔值的谓词。见声明:
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
return filterTo(ArrayList<T>(), predicate)
}
(T) -> Boolean
T
表示它返回一个布尔值并接受 T 类型的输入。it
在这种情况下。
字符串不是布尔值。如果你实际上有一个布尔列表,你可以这样做:
val list = listOf(true, true, false, true, true, false )
val sortedList = list.filter{ it }
它是有效的,因为它是一个布尔值。但是,对于所有其他类型,如果您打算进行过滤,则需要将其转换为布尔运算。
但是,由于您实际上似乎没有进行任何过滤,只需将其删除并执行以下操作:
val sortedList = spices.sortedBy { it.length }
如果您必须以某种方式对其进行过滤,请确保您获得布尔运算或值。
为了实际对其进行排序,您必须对 value 做一些事情sortedBy
。在我的示例中,我将其分配给一个新字段,但您也可以将其分配给前一个字段。但是,如果您这样做,则必须将其设为 avar
而不是 a val
。
推荐阅读
- asp.net-identity - 身份用户 .net 4.6 和 .net core 2.2
- scala - 尝试/捕获具有奇怪语法的项目
- pointers - 将字符串指针转换为空字符串为 nil
- c++ - 如何操作包含二维数组的结构数组
- reactjs - “JSX 映射到函数调用”是什么意思
- python - 无法在 anaconda 中安装 poppler 模块
- html - 未应用 Bootstrap 4 卡片组等高
- java - 实施国家以推动活动
- android - 如何解决我从android中的一组通知扩展时未显示的所有通知的问题
- django - 如何在本地环境中使用 Django 提供媒体文件?