代码之家  ›  专栏  ›  技术社区  ›  Milo Lu

如何将for yield循环与if/else构造相结合

  •  0
  • Milo Lu  · 技术社区  · 7 年前

    val d = Array(1,-1,23,-5,7,8,0,-9)
    

    我把所有的偶数除以2

    val index = for(i <- 0 until d.length if d(i)%2==0) yield d(i) / 2
    

    val index = for(i <- 0 until d.length if d(i)%2==1) yield d(i) + 1
    

    如何在一个步骤中结合这两个操作?

    val index = for(i <- 0 until d.length) if(d(i)%2==0) yield d(i) / 2 else yield d(i) + 1
    

    然后我得到一个语法错误

    illegal start of simple expression
    
    3 回复  |  直到 7 年前
        1
  •  1
  •   Milo Lu    7 年前

    你不能叫多重收益。 所以试试这个:

    val d = Array(1,-1,23,-5,7,8,0,-9)
    val index = for(i <- 0 until d.length) yield (if(d(i)%2==0) d(i) / 2 else d(i) + 1)
    
        2
  •  1
  •   Tim    7 年前

    你需要用一个 yield 带着一个 if 后面的表达式 产量 (如评论中所述)

    但是您不需要迭代索引,您可以直接迭代数组:

    for (v <- d) yield if (v%2 == 0) v/2 else v + 1
    

    这相当于 map 电话:

    d.map(v => if (v%2 == 0) v/2 else v + 1)
    

    你也可以使用 collect 为此:

    d.collect {
      case v if v%2 == 0 =>
        v / 2
      case v =>
        v + 1
    }
    
        3
  •  1
  •   Balaji Reddy    7 年前

    for{ value <- d
    value2  = if(value ÷2 == 0 ) value/2 else value+1
    } yield value2
    

    结果

    Array(2,0,24,-4,8,4,0;-8)
    
    推荐文章