例如,我的输入是:

scala> val myList = List("7842", "abf45", "abd", "56")
myList: List[String] = List(7842, abf45, abd, 56)
784256可以转换为Int;因此,我的预期输出是2。我们可以假设不会出现负整数,因此-67是不可能的。

这是我到目前为止的内容:
scala> myList.map(x => Try(x.toInt).getOrElse(-1)).count(_ > -1)
res15: Int = 2

这应该可以正常工作,但是我觉得我缺少一个更优雅,更易读的解决方案,因为我要做的就是计数成功的次数。

最佳答案

我会警告不要在控制流中使用异常处理(例如Try)-这非常慢。

这是一个使用惯用的Scala收集操作,性能良好且不会计算负数的解决方案:

scala> val myList = List("7842", "abf45", "abd", "56")
myList: List[String] = List(7842, abf45, abd, 56)

scala> myList.count(_.forall(_.isDigit))
res8: Int = 2

编辑:@immibis指出,这将不会检测到超过Integer.MaxValue的数字字符串。如果这是一个问题,我将建议采用以下方法之一:
import scala.util.Try
myList.count(x => Try(x.toInt).filter(_ >= 0).isSuccess)

或者,如果您希望在仍然处理这种极端情况的同时保持我的第一个答案的效果,请执行以下操作:
import scala.util.Try
myList.count(x => x.forall(_.isDigit) && Try(x.toInt).filter(_ >= 0).isSuccess)

关于scala - 计算列表中可以转换为Int的字符串数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42239201/

10-14 16:02
查看更多