Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何改进用Scala编写的这段代码?_Scala - Fatal编程技术网

如何改进用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。谢谢你的指针!:)谢谢你的回答!