我需要在读取数据文件后将某些字符串值转换为Ints。该字段可能为空,这会在尝试执行转换时导致错误。有没有简单的方法来检查空(或可以转换为整数的适当的值),并只是返回0,如果它不能被转换? getOrElse似乎是一种可能性,但我无法完成工作。我可以写一个很容易做到的功能,但我希望有一个更优雅/简洁的方法来做到这一点。Scala:Succint方法检查空/空值并返回0而不是
2
A
回答
8
可以使用Try
单子(记录here),它有一个getOrElse
方法:
import scala.util.Try
val zero = Try { "foo".toInt }.getOrElse(0)
val leet = Try { "1337".toInt }.getOrElse(0)
val parseOrZero: String => Int = x => Try(x.toInt) getOrElse 0
val lines = Seq("123", "42", "sdfd", null, "")
lines.map(parseOrZero)
->> res0: Seq[Int] = List(123, 42, 0, 0, 0)
或在线:
lines.map(x => Try(x.toInt) getOrElse 0)
Try
还具有toOption
方法,如果成功则获得Some(value)
,或None
发生异常。所以,如果你想过滤掉不好的项目,而不是返回0
,你可以这样做:
lines.flatMap(x => Try(x.toInt).toOption)
Try
还拥有所有有用的单子变换像map
和flatMap
的链接更多的计算。
1
转换只整数值:
val lines = Seq("123", "42", "sdfd", null, "") // read strings from anywhere
val result = lines
.filter(s => Option(s).isDefined) // drop null values
.filter(_.matches("\\d+")) // drop non integer values
.map(Integer.parseInt) // convert to int
result: Seq[Int] = List(123, 42)
还是回到0,而不是不正确的:
val lines = Seq("123", "42", "sdfd", null, "") // read strings from anywhere
def convert(s: String): Int =
Option(s)
.filter(_.matches("\\d+"))
.map(Integer.parseInt)
.getOrElse(0)
val result = lines.map(convert)
result: Seq[Int] = List(123, 42, 0, 0, 0)
1
默认toInt
函数抛出一个异常,但你可以提供一个更安全的版本,返回一个Option
,然后使用getOrElse
就可以了
def toInt(s: String): Option[Int] =
try {
Some(s.toInt)
} catch {
case e: Exception => None
}
toInt("42").getOrElse(0) // 42
toInt("foo").getOrElse(0) // 0
或者,您可以使用scalaz
,它在String
上提供parseInt
方法,该方法返回Validation[NumberFormatException, Int]
,您可以将其转化为Option
。例如:
"42".parseInt.toOption.getOrElse(0) // 42
"foo".parseInt.toOption.getOrElse(0) // 0
相关问题
- 1. 返回空而不是0
- 2. hibernate query.list()方法返回空列表而不是空值
- 3. 使DAX返回0而不是空白
- 4. 检查返回值的资源是空
- 5. 呼叫`ConcurrentLinkedQueue.poll`对空队列似乎返回0,而不是空
- 6. Django DecimalField返回“None”而不是空值
- 7. NotesSession.GetDataBase方法返回空值
- 8. SQL:检查'值'不为空当'值'为空时返回TRUE
- 9. ALTER TABLE添加检查空值,而不是空值
- 10. 从数据库返回检索空而不是值增加
- 11. LINQ2SQL:总是.SUM()返回0,而不是空
- 12. 检查一个GET方法是空/空
- 13. SQL语句,返回空值,而不是空
- 14. ASP.net CustomValidator - ClientValidationFunction检查值不是空白,而不是初始值
- 15. Excel公式返回0而不是空白
- 16. SQL查询返回0而不是NULL
- 17. 如何检查是否返回为空?
- 18. ArrayDeque不为空,但返回为空查询方法
- 19. 什么是检查和处理空返回值的正确方法?
- 20. 计数,函数返回空记录集需要返回0,而不是
- 21. 空字符串返回而不是IndexError
- 22. 返回空数组而不是null
- 23. 返回 “批准” 列的值 “是\ 0 \ 0 \ 0 \ 0 \ 0 \ 0”,而不是 “是”
- 24. 查找类方法返回空对象而不是用户数据
- 25. 如何让查询返回0,而不是空集,如果没有结果
- 26. TableAdapter查询返回空值
- 27. 查询返回空值
- 28. 查询返回空值
- 29. jQuery的AJAX方法返回空值
- 30. MySQL查询总是返回空值
恕我直言,异常对于scala来说太贵了。 – 2014-11-06 17:07:24