在Scala中将列表[Try [A]]转换为列表[A] [英] Converting a List[Try[A]] to List[A] in Scala

查看:61
本文介绍了在Scala中将列表[Try [A]]转换为列表[A]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从输入数据中过滤掉错误的输入.我目前正在使用 scala.util.Try 来包装所有异常.以下是一个简单的示例,其中3I抛出 NumberFormatException .我想知道在Scala中是否有更好的方法?

I want to filter out bad input from input data. I'm currently using scala.util.Try to wrap any exceptions. Following is a simple example where 3I throws a NumberFormatException. I was wondering if there is a better way of doing this in Scala ?

val data = List ( ("Joe", "20"), ("James", "30"), ("Pete", "3I") )

scala> val parsedData = data.map{ d => Try{Person( d._1, d._2.toInt ) }}
parsedData: List[scala.util.Try[Person]] = List(Success(Person(Joe,20)), Success(Person(James,30)), Failure(java.lang.NumberFormatException: For input string: "3I"))

scala> val validdata = parsedData.map{ x => x match {
     | case Success(s) => Some(s)
     | case Failure(f) => None }
     | }
validdata: List[Option[Person]] = List(Some(Person(Joe,20)), Some(Person(James,30)), None)

scala> validdata.flatten
res13: List[Person] = List(Person(Joe,20), Person(James,30))

推荐答案

使用 collect 仅保留与所需模式匹配的值:

Use collect to keep only the values that match the pattern you desire:

parsedData collect { case Success(x) => x }

这也可以工作,尽管我认为还不是很清楚:

This will also work, though I don't think it's quite as clear:

parsedData.flatMap(_.toOption)

这篇关于在Scala中将列表[Try [A]]转换为列表[A]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆