risc-v中文社区

 找回密码
 立即注册
查看: 1066|回复: 1

[原创] risc-v开发基础 Scala For表达式---(32)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-28 22:44:40 | 显示全部楼层 |阅读模式
通常,for表达式的形式如下:
for(a <- animals; an=a.name;if(an startsWith "Black")) yield n
总结起来就是:
for(seq} yield expr
其中seq由生成器,定义,以及过滤器组成序列,以分号分隔,当然,
如果for用大括号括起来,每一个语句都占一行,那么就和普通的SCALA语句一样,就不需要分号。
class Animalx(val name:String,var age:Int)
object ForYieldTest {
  def main(args: Array[String]): Unit = {
    val lis = List(new Animalx("jack",1),new Animalx("xixi",4),new Animalx("tom",1),new Animalx("xixi",3))
    val r = for(a <- lis;an=a.name;if(an.contains("xi"))) yield (a.name,a.age)
    println(r)
    //如果用大括号
    val r1 = for {
      a <- lis
      an=a.name
      if(an.contains("xi"))
    } yield(a.name,a.age)
    println(r1)
    //如果多个生成器,则前面的生成一个,后面的生成一轮
    val r2 = for(x <- List(1,2);y <- List("one","two")) yield (x,y)
    println(r2)
  }
}
显示如下:
List((xixi,4), (xixi,3))
List((xixi,4), (xixi,3))
List((1,one), (1,two), (2,one), (2,two))

回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-8-28 22:50:55 | 显示全部楼层
如果是 case class Animals(val name:String,var age:Int)
val r3 = for(Animalx(n,a) <- lis) yield (n,a)
println(r3)
显示如下:
List((jack,1), (xixi,4), (tom,1), (xixi,3))
也就是说:生成器中可以采用模式匹配
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-19 17:09 , Processed in 0.015544 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表