我是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
}
}
有什么想法吗?
答案 0 :(得分:6)
实际上你的第二种方式是功能风格,但为了简明起见,你可以使用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")
}
答案 1 :(得分:2)
在我看来,你的模式匹配是处理Option的功能方式。
如果您对这些嵌套的case语句感到困扰,为什么不重构它们,将这些20-25行拉出到新方法中并在case Some(_)
正文中调用此方法?
答案 2 :(得分:2)
也许
for (dataValue <- dataMap.get(input)) yield {
cleanData(dataValue)
doSomethingElse("apple", dataValue, "test")
}