我想知道如何改进此代码以使其更具可读性和流畅性.感谢您的帮助,谢谢.
// 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的总体洞察力.感谢那!
您可能还会考虑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)
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |