如何改进用Scala编写的这段代码?
我想知道如何改进这段代码,使其更具可读性和流动性。谢谢你的帮助,谢谢如何改进用Scala编写的这段代码?,scala,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 =
// 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)
}
}
我只是想学习如何以一种更具声明性(如果可以的话)的方式编写这段代码,在简单性和可读性方面
下面的答案显示了做同一件事的不同风格,这也有助于拓宽我对FP和Scala的总体认识。谢谢你
val dwtListZon = query.zoneOpt filter (_.crwStn333 != "all") map (zon =>
dwtListStn.filter(_.crwStnAbbr3 == zon.crwStnAbbr3) ) getOrElse dwtListStn
或者如果你想要可读性
val filteredSomething = for(zon <- query.zoneOpt if zon.crwStn333 != "all")
yield dwtListStn.filter(_.crwStnAbbr3 == zon.crwStnAbbr3)
val dwtListZon = filteredSomething getOrElse dwtListStn
<代码> ValFieldDead =(ZON
)你也可以考虑<代码>折叠/<代码>函数,它可以在<代码>选项>代码>。它通常是一个很好的语法,用于<代码>选项>代码>默认值,你可以使用优雅的部分函数语法:
query.zoneOpt.fold(dwtListStn) {
case zon if zon.crwStn333 == "all" => dwtListStn
case zon => dwtListStn.filter(_.crwStnAbbr3 == zon.crwStnAbbr3)
}
这里的另一个一般策略是翻转操作。逻辑的所有分支都返回一些过滤或未过滤版本的dwtlisttn
,因此您可以将整个操作想象为一个过滤器
:
dwtListStn.filter { dwt =>
query.zoneOpt match {
case Some(zone) if zone.crwStn333 == "all" => false
case Some(zone) => dwt.crwStnAbbr3 == zon.crwStnAbbr3
case None => false
}
}
正常匹配也可以是清晰的。如果条件:
query.zoneOpt match {
case Some(zon) if (zon.crwStn333 != "all") =>
dwtListStn.filter(_.crwStnAbbr3 == zon.crwStnAbbr3)
case _ =>
dwtListStn
}
可能是codereview的一个问题。stackexchange我将投票结束这个问题,因为这个问题属于codereview.stackexchange.com。如果没有额外的上下文,关于这个代码应该实现什么以及在什么情况下,这将不会是代码审查的主题。这就是我一直在寻找的,谢谢!@事实上我犯了一点小错误,请检查更新从OOP背景开始,我正在尝试学习更多的功能性编码方式,并看到做同一件事的不同方式,真的,真的,很有帮助!谢谢你花时间分享另一种编码方式。我真的很感激。@AS OOP practicioner我有一个建议。在你对函数组合和scala类型系统充满信心后,请查看Haskell并挖掘它,直到你了解整个标准库和镜头的方法。然后回到scala。谢谢你的指针!:)谢谢你的回答!