将命令式表达式转换为功能式范式

时间:2015-09-15 12:28:27

标签: scala

我的代码中包含以下Scala代码段。我无法将其转换为功能样式。我可以在我的代码中的其他地方执行此操作但无法将下面的更改为功能。问题是一旦代码耗尽所有模式匹配选项,那么只有它应该发回“NA”。以下代码正在执行此操作,但它不是函数式(fo​​r-yield)

var matches = new ListBuffer[List[String]]()
      for (line <- caselist){
        var count = 0
        for (pat <- pattern if (!pat.findAllIn(line).isEmpty)){
          count += 1
          matches += pat.findAllIn(line).toList
        }
        if (count == 0){
          matches += List("NA")
        }
       }
      return matches.toList
     }

2 个答案:

答案 0 :(得分:0)

您的问题并不完全,所以我无法确定,但我相信以下内容可以胜任:

  for {
    line <- caselist
    matches = pattern.map(_.findAllIn(line).toList)
  } yield matches.flatten match {
    case Nil => List("NA")
    case ms => ms
  }

答案 1 :(得分:0)

这应该可以胜任。使用foreachfilter生成匹配项并检查以确保每行都匹配。

caseList.foreach{ line =>
  val results = pattern.foreach ( pat => pat.findAllIn(line).toList )
  val filteredResults = results.filter( ! _.isEmpty )
  if ( filteredResults.isEmpty ) List("NA")
  else filteredResults
}

功能并不代表你不能拥有中间命名值。