繁体   English   中英

scala:如何以功能方式处理Option

[英]scala: How to handle Option in a functional way

我是scala的新手,所以我的问题可能完全是愚蠢的。 如果我有一个像下面这样的现有方法。 我将这4行添加到方法中。 有没有更好的方法来处理期权价值?

def processData(input: String, dataMap: Map[String, String]): Option[String] = {

   //4 lines I am adding.
   val data: Option[String] = dataMap.get(input)
   if (data.isEmpty) {
     return None
   }

   //how to avoid this line
   val dataValue = data.get

   //20-25 lines of code in here with bunch of pattern matching case statements
   cleanData(dataValue)
   doSomethingElse("apple", dataValue, "test")
}

基本上我想避免在下面的代码中执行“data.get”。 这称之为感觉不对。 我可以使用模式匹配以不同的方式编写这个。 但是20-25行代码有大量的case语句,我不想​​在它们之上创建另一个层。

def processData(input: String, dataMap: Map[String, String]): Option[String] = {

 dataMap.get(input) match {

   case Some(dataValue) => {
   //20-25 lines of code in here with bunch of pattern matching case statements
    cleanData(dataValue)
    doSomethingElse("apple", dataValue, "test")
  }
   case None => None
 }

}

有任何想法吗?

实际上你的第二种方式是功能风格,但为了简洁起见,你可以使用Option更高阶函数之一:

  def processData(input: String, dataMap: Map[String, String]): Option[String] = 
    dataMap.get(input).map { dataValue =>
      cleanData(dataValue)
      doSomethingElse("apple", dataValue, "test")
    }

你甚至可以避免使用圆点和圆括号:

  def processData(input: String, dataMap: Map[String, String]): Option[String] = 
    dataMap get input map { dataValue =>
      cleanData(dataValue)
      doSomethingElse("apple", dataValue, "test")
    }

在我看来,模式匹配处理Option 的功能方式

如果您对这些嵌套的case语句感到困扰,为什么不重构它们,将这些20-25行拉出到一个新方法中并在case Some(_) body中调用此方法?

也许

for (dataValue <- dataMap.get(input)) yield {
  cleanData(dataValue)
  doSomethingElse("apple", dataValue, "test")
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM