我正在寻找一种将2个字符串转换为双字符然后进行比较的惯用方法吗?
为了安全地转换为双倍,我有:
def toDouble(s: String): Option[Double] = {
try { s.toDouble } catch { case _ => None }
}
所以我正在做一个for表达式来比较2个双打:
for {
d1 <- toDouble(s1)
d2 <- toDouble(s2)
} yield (d1 > d2)
现在说我想做(d1 < d2)
,我能以某种方式推广这个吗?
是否有任何改进使这个更干净?
答案 0 :(得分:2)
import scala.util.Try
def f(x: String,
y: String,
compare: (Double, Double) => Boolean): Option[Boolean] = for {
a <- Try { x.toDouble }.toOption
b <- Try { y.toDouble }.toOption
} yield compare(a, b)
scala> f("42", "66", _ < _)
res0: Option[Boolean] = Some(true)
scala> f("42", "66", _ > _)
res1: Option[Boolean] = Some(false)
我更喜欢比Boolean
更好的类型,所以我的答案还有改进的余地。
答案 1 :(得分:1)
如果您尝试转换无法转换为Double的内容,则引用的StringLike中提供的“toDouble”会抛出NumberFormatException。使用它是“惯用的”,但将其包装在scala.util.Try中并返回Try。
返回尝试而不是选择将更加惯用(并且更好),因为“无”在语义上不会向调用者指示问题发生,而“尝试”结果(看起来像Failure(java.lang.NumberFormatException: For input string: "hi")
则表示如此)。
最后,我会跳过For / Yield,因为更简单地执行以下操作:
import scala.util.Try
Try(s1.toDouble < s2.toDouble)
Kevin Meredith的回答显示了如何通过创建更高阶函数来推广。