在scala的for循环中,如何在不适用容器的情况下,在for循环(外面)后面调用其for中定义的属性。对象中包含None属性在for中如何剔除???
两种情况写在同一个函数里面:
/**for推导:能够在for表达式中的最初部分定义值,病在后面的表达式中使用该值
* 如upcaseBreed在println中使用*/
def roundingFor: Unit ={
val dogBreeds = List("Doberman","Dachshund","Scottish","Portuguese")
for {
breed <- dogBreeds
/**尽管upcaseBreed的值不可变,upcaseBreed不需要在前面设定,但并不需要使用val关键字进行限定*/
upcaseBreed = breed.toUpperCase
} println(upcaseBreed) //相当于在for循环后面使用for内的属性
println(
""" *
| ***
| *****
|*********
| *****
| ***
| *
""".stripMargin)
val catBreeds = List(Some("Dane"),None,Some("Yorkshire"),None,Some("Scottish"))
println("first pass:")
for {
/**每个被提取的元素均为Option对象。而后续的代码中将使用箭头符提取Option中的值,推导式会进行有效的检查并忽略None,不会有异常*/
breedOption <- catBreeds
breed <- breedOption
upcaseBreed = breed.toUpperCase
} println(upcaseBreed)
println("second pass:")
/**在第一个for循环内部定义的breed和upcaseBreed属性在下面的第二个for循环中使用*/
for {
/**此for推导式使用了模式匹配,只有当breedOption是Some类型时,表达式Some(breed) <- catBreeds才会执行并提取出breed*/
Some(breed) <- catBreeds
upcaseBreed = breed.toUpperCase
} println(upcaseBreed)
}