如何改进用Scala编写的这段代码?

AS_*_*AS_ 0 scala

我想知道如何改进此代码以使其更具可读性和流畅性.感谢您的帮助,谢谢.

// filter DWT based on Zone
val dwtListZon = query.zoneOpt match {
  case None => dwtListStn
  case Some(zon) => {
    if (zon.crwStn333 == "all") {
      dwtListStn
    }
    dwtListStn.filter(_.crwStnAbbr3 == zon.crwStnAbbr3)
  }
}
Run Code Online (Sandbox Code Playgroud)

我只想学习如何在简单性和可读性方面编写代码,以更具声明性(如果可能)的方式编写代码.

下面的答案显示了做同样事情的不同风格,这也有助于扩大我对FP和Scala的总体洞察力.感谢那!

Ben*_*ich 5

您可能还会考虑fold可用的功能Option.对于Options默认值,它通常是一个很好的语法,您可以使用优雅的部分函数语法:

query.zoneOpt.fold(dwtListStn) { 
    case zon if zon.crwStn333 == "all" => dwtListStn
    case zon => dwtListStn.filter(_.crwStnAbbr3 == zon.crwStnAbbr3)
} 
Run Code Online (Sandbox Code Playgroud)

这里的另一个一般策略是翻转操作.所有逻辑分支都返回一些过滤或未过滤的版本dwtListStn,因此您可以将整个操作视为filter:

dwtListStn.filter { dwt => 
    query.zoneOpt match {
        case Some(zone) if zone.crwStn333 == "all" => false
        case Some(zone) => dwt.crwStnAbbr3 == zon.crwStnAbbr3
        case None => false
    }
}
Run Code Online (Sandbox Code Playgroud)