首页 > 解决方案 > 在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 有什么用?

标签: scala

解决方案


以下是您的示例代码的略微简化版本:

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))

推荐阅读