scala学习笔记(2)
1 Loop
(1) for (i <- 1 to 3){
# 1 2 3
}
(2) for (i <- 1 until 3){
#1 2
}
(3)过滤
for (i <- 1 to 10;
if i != 3; if i < 8){
# 1 2 4 5 6 7
}
(4) yield
for 循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合。Scala 中 for 循环是有返回值的。如果被循环的是 Map,返回的就是 Map,被循环的是 List,返回的就是 List,以此类推。
基本语法
1 2 3 | var retVal = for { var x <- List if condition 1 ; if condition 2 ... } yield x |
例子
1 2 3 4 5 6 7 8 9 10 | scala> for (i <- 1 to 5 ) yield i * 2 res 11 : scala.collection.immutable.IndexedSeq[Int] = Vector( 2 , 4 , 6 , 8 , 10 ) scala> val a = Array( 1 , 2 , 3 , 4 , 5 ) a : Array[Int] = Array( 1 , 2 , 3 , 4 , 5 ) scala> for (e <- a) yield e res 5 : Array[Int] = Array( 1 , 2 , 3 , 4 , 5 ) for (i <- a if i % 2 == 0 if i > 6 ) yield i res 53 : List[Int] = List( 8 ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | object Test { def main(args : Array[String]) { var a = 0 ; val numList = List( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ); // for loop execution with a yield var retVal = for { a <- numList if a ! = 3 ; if a < 8 } yield a // Now print returned values using another loop. for ( a <- retVal){ println( "Value of a: " + a ); } } } |
(5) 多个for
1 2 | for (i <- 1 to 3 ; j <- 4 to 6 if i ! = j) yield (i, j) res 5 : scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector(( 1 , 4 ), ( 1 , 5 ), ( 1 , 6 ), ( 2 , 4 ), ( 2 , 5 ), ( 2 , 6 ), ( 3 , 4 ), ( 3 , 5 ), ( 3 , 6 )) |
2
在scala中,并不提供break或continue等语句,如果要跳出循环,有以下语句:
1. 使用一个布尔控制变量代替——while循环中
2. 使用return
3. 使用Breaks对象中的break方法:
import scala.util.control.Breaks._
breakable {
for (...) {
if (...) break; // Exits the breakable block
...
}
}
3 数组
1 2 3 4 5 6 7 | val greetStrings = new Array[String]( 3 ) //或者 val numNames = Array( "zero" , "one" , "two" ) scala> numNames( 0 ) //提取数据不用[]而是用() res 54 : String = zero |
4 Option
选项 Option
Option 是一个表示有可能包含值的容器。
Option基本的接口是这样的:
1 2 3 4 5 | trait Option[T] { def isDefined : Boolean def get : T def getOrElse(t : T) : T } |
Option本身是泛型的,并且有两个子类: Some[T] 或 None
我们看一个使用Option的例子:
Map.get 使用 Option 作为其返回值,表示这个方法也许不会返回你请求的值。
1 2 3 4 5 6 7 8 | scala> val numbers = Map( "one" -> 1 , "two" -> 2 ) numbers : scala.collection.immutable.Map[java.lang.String,Int] = Map(one -> 1 , two -> 2 ) scala> numbers.get( "two" ) res 0 : Option[Int] = Some( 2 ) scala> numbers.get( "three" ) res 1 : Option[Int] = None |
现在我们的数据似乎陷在Option中了,我们怎样获取这个数据呢?
直觉上想到的可能是在isDefined方法上使用条件判断来处理。
1 2 3 4 5 6 | // We want to multiply the number by two, otherwise return 0. val result = if (res 1 .isDefined) { res 1 .get * 2 } else { 0 } |
我们建议使用getOrElse或模式匹配处理这个结果。
1 2 3 4 | val result = res 1 match { case Some(n) = > n * 2 case None = > 0 } |
getOrElse 让你轻松地定义一个默认值。
1 | val result = res 1 .getOrElse( 0 ) * 2 |
模式匹配能自然地配合Option使用。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· DeepSeek+PageAssist实现本地大模型联网
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· 从 14 秒到 1 秒:MySQL DDL 性能优化实战