scala-for推导:能够在for表达式中的最初部分定义值,并在(外面)后面的表达式中使用该值

本文探讨了Scala中for循环的高级应用,包括如何在for循环外部使用内部定义的属性,以及如何通过模式匹配和Option类型优雅地处理可能存在的None值,避免运行时异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值