gpt4 book ai didi

scala - 查找 Seq 中满足条件 X 的第一个元素

转载 作者:行者123 更新时间:2023-12-03 07:49:08 24 4
gpt4 key购买 nike

一般来说,如何找到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

还不错。但是1.有点难看。 2.它做了一些不必要的工作(尝试了 "MM yyyy""MM, yyyy" 格式)。也许有更优雅和惯用的方式? (使用迭代器?)

最佳答案

您应该在序列上使用find方法。一般来说,您应该更喜欢内置方法,因为它们可能针对特定序列进行了优化。

Console println List(1,2,3,4,5).find( _ == 5)
res: Some(5)

即返回第一个匹配的 SimpleDateFormat:

 val str = "1903 January"
val formats = List("MMM yyyy", "yyyy MMM", "MM yyyy", "MM, yyyy")
.map(new SimpleDateFormat(_))
formats.find { sdf =>
sdf.parse(str, new ParsePosition(0)) != null
}

res: Some(java.text.SimpleDateFormat@ef736ccd)

返回已处理的第一个日期:

val str = "1903 January"
val formats = List("MMM yyyy", "yyyy MMM", "MM yyyy", "MM, yyyy").map(new SimpleDateFormat(_))
val result = formats.collectFirst {
case sdf if sdf.parse(str, new ParsePosition(0)) != null => sdf.parse(str)
}

或使用惰性收集:

val str = "1903 January"
val formats = List("MMM yyyy", "yyyy MMM", "MM yyyy", "MM, yyyy").map(new SimpleDateFormat(_))
formats.toStream.flatMap { sdf =>
Option(sdf.parse(str, new ParsePosition(0)))
}.headOption

res: Some(Thu Jan 01 00:00:00 EET 1903)

关于scala - 查找 Seq 中满足条件 X 的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16883591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com