gpt4 book ai didi

Scala 给定列表 map/filter/take 而无需遍历整个列表

转载 作者:行者123 更新时间:2023-12-02 07:59:58 25 4
gpt4 key购买 nike

给定一个元素列表,我需要映射(获取响应)/过滤(检查响应是否有效)/获取(只获取第一个有效的 n 个元素)而不遍历整个列表。

例如我有一个包含 10 个元素的列表。
第一个有效
第二个无效
第三个有效
第四次及以后有效

示例代码

List(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
.map{x => println("Some req/res"); x}
.filter{_ % 2 == 0} //filter for valid responses
.take(3) //take first 3 valid ones

我希望 println("Some req/res") 只打印 4 次,但它打印了 20 次。
如何在不遍历整个列表的情况下获取前 n 个有效元素?

现在我正在使用带有累加器列表的 for 循环并检查它的大小直到它充满有效响应。我正在寻找更实用的方法。

谢谢。

最佳答案

您想使结果成为延迟计算的集合。一种简单的方法是添加 .view

val res = List(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)
.view
.map{x => println("Some req/res"); x}
.filter{_ % 2 == 0} //filter for valid responses
.take(3) //take first 3 valid ones
//res: scala.collection.View[Int] = View(<not computed>)

您会注意到现在没有println() 输出。那是因为结果还没有被“强制”出来。但这仍然是一个很好的结果,您可以进一步处理。

如果只是想看结果有很多方法可以强制求值。这是一个简单的。

res.toList
//Some req/res
//Some req/res
//Some req/res
//Some req/res
//Some req/res
//Some req/res
//res0: List[Int] = List(2, 4, 6)

关于Scala 给定列表 map/filter/take 而无需遍历整个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58666927/

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