作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个元素列表,我需要映射(获取响应)/过滤(检查响应是否有效)/获取(只获取第一个有效的 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/
我是一名优秀的程序员,十分优秀!