Scala comprehension表达式

本文深入探讨Scala中forComprehension的使用,这是一种用于创建新集合的for表达式,适用于列表和其他支持特定操作的数据类型。文章通过示例展示了如何使用生成器、过滤器和yield关键字来筛选和构建集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

for comprehension


for comprehension是一种用于创建新集合的for表达式

Scala提供了轻量级符号来表示序列理解(sequence comprehensions)。理解具有形式for (enumerators) yield e,此处的enumerators指的是分号间隔的枚举器列表。枚举器表示引入新变量的生成器,或过滤器。理解计算通过枚举器生成的每个绑定的主体e,并且返回这些值的序列。

case class User(name: String, age: Int)

val userBase = List(User("Travis", 28),
  User("Kelly", 33),
  User("Jennifer", 44),
  User("Dennis", 23))

val twentySomethings = for (user <- userBase if (user.age >=20 && user.age < 30))
  yield user.name 

note:伴随yield的for循环创建了List。
note:user <- userBase是生成器。
note: if(user.age >= 20 && user.age < 20)是护卫,将非20s的用户过滤。

def foo(n: Int, v: Int) =
   for (i <- 0 until n;
        j <- i until n if i + j == v)
   yield (i, j)

note:生成二元组,二元组内元素的值位于0到n-1之间,并且两元素和为v。

理解并不仅限于列表,每个支持withFilter、map与flatMap操作的数据类型都可以被用于序列理解。

可以忽略理解中的yield,在这种情况下,理解返回Unit。

忽略yield

def foo(n:Int, v:Int) =
    for (i <- 0 until n; j <- i until n if i + j == v)
    println(s"($i, $j)")

翻译源:Scala Tour

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值