scala - 在for循环scala中产生值
问题描述
我有 3 个代码,第一个是主代码,其余 2 个代码用于循环,两个代码的功能相同。但都生成不同的 o/p。主要代码=>
class user(var name:String,var id:Int, var gender:Option[String])
{
override def toString="("+ name+","+id+","+gender+")"
}
object a
{
def main(args:Array[String]):Unit={
var mm=Map(1-> new user("jh",189,Some("Male")),2->new user("gh",12,None),3
->new user("io",100,Some("Female"))
def getkey(i:Int)=
{ mm.get(i)
}
代码 1 =>
var b=for{
h<-getkey(1)
i<-h.gender} yield i
print(i)
}
}
代码 2=>
var b=for{
h<-getkey(1)
i=h.gender} yield i
print(i)
}
}
第一个代码有 o/p some(Male) andd 2 nds o/p has Some(Some(Male)) 为什么两个代码生成不同的 o/p?如果我在 getkey(1) 中用 = 替换 <- 我得到错误。为什么我们会得到它? <- in for 有什么用?
解决方案
以下是您的示例代码的略微简化版本:
class User(var name: String, var id:Int, var gender: Option[String])
val mm = Map(
1 -> new User("jh", 189, Some("Male")),
2 -> new User("gh", 12, None),
3 -> new User("io", 100, Some("Female"))
)
def getkey(i:Int) = mm.get(i)
代码片段 1:
for {
h <- getkey(1)
i <- h.gender
} yield i
可以翻译成:
getkey(1).flatMap(_.gender)
// res1: Option[String] = Some(Male)
代码片段 2:
for {
h <- getkey(1)
i = h.gender
} yield i
i = h.gender
是一项任务,与以下for-yield
没有什么不同:
for {
h <- getkey(1)
} yield h.gender
并且可以翻译成:
getkey(1).map(_.gender)
// res2: Option[Option[String]] = Some(Some(Male))
推荐阅读
- accordion - Div 未在 Angular 6 中的特定 ngFor 下方打开
- jmeter - 我必须使用多个用户登录并喜欢或不喜欢使用 JMeter 的帖子
- ta-lib - talib 计算 rsi 和交换 rsi 看起来非常不同
- python - 通过使用python消除异常值达到目标斜率值
- python-3.x - python - 了解多个值之间的相关值
- r - R:删除标点
- java - 将 weblogic 升级到 12.2.1.3.0 并将 java 从 1.7 升级到 1.8 - 异常 WELD-001408 未满足的依赖项
- openmodelica - OpenModelica 中的调用函数
- python - Odoo 10:无法在 python 中使用元素树解析日期字段
- python - 创建 pd.date_range 的 pandas 列