gpt4 book ai didi

kotlin - Kotlin 中是否有任何{}、all{} 和 none{} 惰性操作?

转载 作者:行者123 更新时间:2023-12-05 00:52:09 26 4
gpt4 key购买 nike

我正在使用函数式编程风格来解决 Leetcode 简单问题,Count the Number of Consistent Strings .这个问题的前提很简单:计算“所有值都在另一个集合中”的谓词所成立的值的数量。

我能够非常简洁地做到这一点:

class Solution {
fun countConsistentStrings(allowed: String, words: Array<String>): Int {
val permitted = allowed.toSet()
return words.count{it.all{it in permitted}}
}
}

我知道 Java 流是惰性的,但已经读过 Kotlin 仅在使用 asSequence 时才会惰性,否则会急切。

对于基于使用 anynoneall 的谓词的 bool 值的简化,对我来说最有意义的是应该懒惰地完成(例如,all 中的单个 false 应该将整个表达式评估为 false 并停止评估其他元素的谓词。

这些操作是这样实现的,还是像 Kotlin 中的其他操作一样急切地完成。如果是这样,有没有办法偷懒?

最佳答案

不,这些方法并不懒惰。

首先,请记住,每个名称都有多个方法:两个在 Sequence 上定义,两个在 13 种数组类型中的每一个上定义,两个在 Map,还有一个关于 Iterable。很明显,您只对 Sequence 上定义的那些类型感兴趣,因为其他类型不支持惰性。

那么,让我们看看文档吧! docs for Sequence.any() , for Sequence.none() , 和 for Sequence.all()方法都说:

The operation is terminal.

要确认这意味着什么,docs for the kotlin.sequences package ,说:

If the sequence operation returns another sequence, which is produced lazily, it's called intermediate, and otherwise the operation is terminal.

所以这些方法不是惰性的;执行时,它们会根据需要对序列进行评估以产生所需的值。 (但是,他们不会对它进行任何进一步的评估,这可能是您要问的。 毕竟,这就是使用序列的意义!)

(实际上,从它们的类型中可以看出,它们不可能是惰性的:它们每个都返回一个 Boolean 值,该值要么为真,要么为假. 为了支持惰性求值,他们需要返回一个 Future 或类似的对象,该对象带有一个可以被调用以产生最终结果的 getter。 但是一个 Boolean 已经 最终结果。)

关于kotlin - Kotlin 中是否有任何{}、all{} 和 none{} 惰性操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70674745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com