Kotlin是一种处理集合的惯用方法,只要某些条件成立

Kotlin是一种处理集合的惯用方法,只要某些条件成立,kotlin,Kotlin,我希望对集合中的对象执行转换,只要存在满足谓词的对象 调用transform(x)后,谓词不再适用于x,但可能适用于以前不适用的其他y。不过,该算法保证会终止 如何改进这一点 while( col.any (p -> predicate(p)) ) { val member = col.find { p -> predicate(p) }!! transform(member) } 编辑: 将@jornsharpe和@hotkey的答案结合起来,以下所有内容都更加简

我希望对集合中的对象执行转换,只要存在满足谓词的对象

调用
transform(x)
后,谓词不再适用于
x
,但可能适用于以前不适用的其他
y
。不过,该算法保证会终止

如何改进这一点

while( col.any (p -> predicate(p)) ) {
    val member = col.find { p -> predicate(p) }!!
    transform(member)
}
编辑:

将@jornsharpe和@hotkey的答案结合起来,以下所有内容都更加简洁高效

do {
    val member = col.find { predicate(it) }?.also { transform(it) }
} while (member != null)


do {
} while (col.find { predicate(it) }?.also { transform(it) } != null)



while (col.find { predicate(it) }?.also { transform(it) } != null) {}
除了注释中所说的内容,您的代码似乎在每次迭代中搜索两次与
谓词匹配的项,第一次在
any
中搜索,然后在
find
中搜索(它们找到相同的项)

您可以使用
find
将其减少为仅一次搜索:

do {
    val member = col.find { predicate(it) }?.also { transform(it) }
} while (member != null)

转换是否一定意味着谓词不再适用于该成员?是的,在调用
transform()
col后,满足谓词的成员减少了一个。因此,筛选和映射可能是一个更简单的过程?因此列表中前面的某个成员现在可能会满足谓词?在这种情况下,你所拥有的可能是最清楚的。您可以使用let删除临时赋值:
col.firstOrNull{predicate(it)}?.let{transform(it)}
,也许吧。对,也可以使用
col.find{predicate(it)}?.let{transform(it)}
Nice,两个观察结果1)这同样有效,尽管有点不寻常:
do{}while(col find{predicate(it)}!=null)
2)这同样有效:
do{}while(col.find{predicate(it)}?.let{transform(it)}!=null)
,因为我的
transform()
返回
Unit
let
只要谓词匹配,就返回
Unit
,然后
null
,所以最后我们有了这个:
while(col.find{predicate>)}?.allow{transform(it)}!=null){}
或更短的
while(col.find(::谓词)?.allow(::transform)!=null)