加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 在Seq中找到满足条件X的第一个元素

发布时间:2020-12-16 09:33:09 所属栏目:安全 来源:网络整理
导读:一般来说,如何在Seq中找到满足一定条件的第一个元素? 例如,我有一个可能的日期格式的列表,我想找到第一个格式的解析结果可以解析我的日期字符串。 val str = "1903 January"val formats = List("MMM yyyy","yyyy MMM","MM yyyy","MM,yyyy") .map(new Sim
一般来说,如何在Seq中找到满足一定条件的第一个元素?

例如,我有一个可能的日期格式的列表,我想找到第一个格式的解析结果可以解析我的日期字符串。

val str = "1903 January"
val formats = List("MMM yyyy","yyyy MMM","MM yyyy","MM,yyyy")
  .map(new SimpleDateFormat(_))
formats.flatMap(f => {try {
  Some(f.parse(str))
}catch {
  case e: Throwable => None
}}).head

不错。但是,它有点丑陋。它做了一些不必要的工作(尝试“MM yyyy”和“MM,yyyy”格式)。也许有更优雅和惯用的方式? (使用Iterator?)

解决方法

如果你有信心至少有一个会格式会成功:

formats.view.map{format => Try(format.parse(str)).toOption}.filter(_.isDefined).head

如果你想要更安全一点:

formats.view.map{format => Try(format.parse(str)).toOption}.find(_.isDefined)

Try在Scala 2.10中推出。

A view是一种能够懒惰地计算值的集合。它将将Try中的代码应用到集合中只有很多项目,以便找到定义的第一个。如果第一种格式适用于字符串,则不会尝试将其余格式应用于字符串。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读