gpt4 book ai didi

arrays - filter(_ :). first 和 first(where :)?

转载 作者:搜寻专家 更新时间:2023-11-01 05:52:10 27 4
gpt4 key购买 nike

请考虑以下字符串数组:

let strings = ["str1", "str2", "str10", "str20"]

假设需要获取包含 5 个字符的第一个元素 (String),我可以使用 filter(_:) 获取它如下:

let filterString = strings.filter { $0.count == 5 }.first
print(filterString!) // str10

但在查看 first(where:) 之后方法,我认识到我将能够获得相同的输出:

let firstWhereString = strings.first(where: { $0.count == 5 })
print(firstWhereString!) // str10

那么使用一个而不是另一个有什么好处呢?只是关于 filter(_:) 返回一个序列而 first(where:) 返回单个元素吗?

更新:

我注意到 filter(_:) 花了 5 次 来完成这样的过程,而 first(where:) 花了 4 次:

enter image description here

最佳答案

您观察到 filter(_:) 是正确的返回满足谓词的所有元素,并且first(where:)返回满足谓词的第一个元素。

所以,这给我们留下了一个更有趣的问题,即 elements.filter(predicate).firstelements.first(其中:谓词)

正如您已经注意到的那样,它们最终都得到了相同的结果。区别在于他们的“评估策略”。调用:

elements.filter(predicate).first

将“急切地”检查所有元素的谓词以过滤完整的元素列表,然后从过滤器列表中选择第一个元素。相比之下,调用:

elements.first(where: predicate)

将“懒惰地”根据元素检查谓词,直到找到满足谓词的元素,然后返回该元素。

作为第三种选择,您可以显式使用“[列表] 的 View ,它提供通常急切操作的惰性实现,例如 mapfilter”:

elements.lazy.filter(predicate).first

这将评估策略更改为“惰性”。事实上,它非常懒惰,以至于仅调用 elements.lazy.filter(predicate) 不会针对 任何 元素检查谓词。只有当 first 元素在这个惰性 View 上被“急切地”计算时,它才会计算足够的元素以返回一个结果。


除了这些备选方案之间的任何技术差异之外,我认为您应该使用最清楚地描述您的意图的那个。如果您正在寻找与条件/谓词匹配的第一个元素,则 first(where:) 最能传达意图

关于arrays - filter(_ :). first 和 first(where :)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46808889/

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