我有一个列表,每个元素有以下字段:active: true/false, optional_id: Int?, name: String
我正在过滤具有活动true的字段,以获得最高的可选_id。
testList.filter { it.active == true }
.maxByOrNull { it.optional_id }
?. optional_id ?: 0
这个想法是,如果列表中有对象,字段活动为真,以获得其中最高的可选_id。否则,如果它们都为假(没有活动字段),则返回0。但由于optional_id是Int类型?,如果没有断言!!
, maxbyyornull不会接受它。对于这种情况,还有其他方法来处理空断言吗?我不能更改optional_id的类型。
您可以使用maxOfWithOrNull
与nullsFirst
比较器。
val highestOptionalId = testList.filter { it.active == true }
.maxOfWithOrNull(nullsFirst(naturalOrder())) { it.optionalId }
?: 0
"Of"建议返回选择器的值,而不是列表中的对象。"With"提示它使用Comparator
。
这是你要找的吗?
testList.filter { it.active && it.optional_id != null }
.maxByOrNull { it.optional_id!! } ?.optional_id
?: 0
在filter(...)
之后,您可以安全地假设(看起来您没有并发性问题)optional_id
在maxByOrNull
中不为空。