加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala – 可以使用for循环多次使用?

发布时间:2020-12-16 09:23:57 所属栏目:安全 来源:网络整理
导读:一个例子: val l = List(1,2,3)val t = List(-1,-2,-3) 我可以这样做吗? for (i - 0 to 10) yield (l(i)) yield (t(i)) 基本上我想为每次迭代产生多个结果. 解决方法 不清楚你要求什么 – 你期望多个收益的语义是什么.有一点,你可能永远不想使用索引来导航
一个例子:

val l = List(1,2,3)
val t = List(-1,-2,-3)

我可以这样做吗?

for (i <- 0 to 10) yield (l(i)) yield (t(i))

基本上我想为每次迭代产生多个结果.

解决方法

不清楚你要求什么 – 你期望多个收益的语义是什么.有一点,你可能永远不想使用索引来导航列表 – 每个调用t(i)都是O(i)来执行.

所以这里有一种你可能会要求的可能性

scala> val l = List(1,3); val t = List(-1,-3)
l: List[Int] = List(1,3)
t: List[Int] = List(-1,-3)

scala> val pairs = l zip t
pairs: List[(Int,Int)] = List((1,-1),(2,-2),(3,-3))

这可能是您可能会要求的另一种可能性

scala> val crossProduct = for (x <- l; y <- t) yield (x,y)
crossProduct: List[(Int,(1,-3),-3))

后来才是语法糖

scala> val crossProduct2 = l flatMap {x => t map {y => (x,y)}}
crossProduct2: List[(Int,-3))

第三种可能性是你要交织它们

scala> val interleaved = for ((x,y) <- l zip t; r <- List(x,y)) yield r
interleaved: List[Int] = List(1,-1,3,-3,4,-4,5,-5,6,-6,7,-7,8,-8,9,-9,10,-10)

这是语法糖

scala> val interleaved2 = l zip t flatMap {case (x,y) => List(x,y)}
interleaved2: List[Int] = List(1,-10)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读