【问题标题】:Yield to foreach - refactor屈服于 foreach - 重构
【发布时间】:2023-04-11 10:30:01
【问题描述】:

我是 Scala 的新手,我有以下代码:

   case _ => {
      val tempA = col2.head
      val collect = col2.drop(1)

      orderCol(collect).foreach {
        tmpCol => (0 until 10).foreach(
          a => (0 until 12).foreach {
            b => {
              val tmpBuild = TmpBuilder.build(tempA, b, a)

              if (isFiltered(tmpBuild, tmpCol)) {
                (tmpBuild :: tmpCol).sortBy(r => (r.tempA, r.B))
              }
            }
          }
        )
      }

//      for {
//        tmpCol <- orderCol(collect)
//        a <- 0 until 10
//        b <- 0 until 12
//        tmpBuild = TmpBuilder.build(tempA, b, a)
//        if (isFiltered(tmpBuild, tmpCol))
//      } yield (tmpBuild :: tmpCol).sortBy(r => (r.tempA, r.B))
    }

注释代码的部分工作(编译)正常。由于我正在学习 Scala,因此我想将已注释的代码重写为未注释的代码,例如:

      orderCol(collect).foreach {
        tmpCol => (0 until 10).foreach(
          a => (0 until 12).foreach {
            b => {
              val tmpBuild = TmpBuilder.build(tempA, b, a)

              if (isFiltered(tmpBuild, tmpCol)) {
                (tmpBuild :: tmpCol).sortBy(r => (r.tempA, r.B))
              }
            }
          }
        )
      }

但是我收到以下错误:

Error:(18, 31) type mismatch;
found   : Unit
required: Set[List[test.TmpBuild]]
  orderCol(collect).foreach {

你知道 foreach 循环有什么问题吗?我应该使用任何地图功能吗? 我将不胜感激。谢谢!

【问题讨论】:

  • 这个case 看起来断章取义。考虑以易于重现问题的方式重写您的问题。这里有一些提示:MCVE.

标签: scala foreach yield


【解决方案1】:

for/yield 组合产生结果,而foreach 返回单位。请改用flatMap+/map

  orderCol (collect).flatMap {
    tmpCol => (0 until 10).flatMap (
      a => (0 until 12).flatMap {
        b => TmpBuilder.build (tempA, b, a)
      }.filter (tmpBuild => isFiltered (tmpBuild, tmpCol)). map {
         (tmpBuild :: tmpCol).sortBy (r => (r.tempA, r.B))
      }
    )
  }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-09-09
  • 2012-11-10
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
  • 2011-04-21
相关资源
最近更新 更多