如何在 Kotlin 中毫无例外地从列表中获取第一个值?

冷静头脑

我有一个格式为“2021-07-14T13:00:00.000+0300”(或类似格式)的日期值。我想将其转换为Date. 在这种情况下,我必须遍历不同格式的循环并检查它们是否失败。

import java.text.*
import java.util.*

val formats = listOf(
    "yyyy-MM-dd'T'HH:mm:ss.SSSZ",
    "dd.MM.yyyy, EEEE, HH:mm" // And many others.
)

val date = "2021-07-14T13:00:00.000+0300"
val locale = Locale.getDefault()

for (format in formats) {
    try {
        return SimpleDateFormat(format, locale).parse(date)
    } catch (e: ParseException) {
    }
}
// If nothing found, return current date.
return Date()

如何将此for循环转换为类似的东西map这样我们就可以无一例外地得到第一个值?

val result = formats.map { ... }
无液

另一个选项,虽然仍在使用firstNotNullOfOrNull(),但parse()与一个ParsePosition对象一起使用当与setLenient(false)*结合使用时,您可以安全地忽略其属性

parse​(String, ParsePosition)版本的优势parse​(String)在于它null在无法解析日期时返回,而不是抛出错误,因此可以避免每次迭代的 try-catch 开销。

除此之外,由于如果所有格式都失败,您将默认为当前日期,因此您可以在最后使用 Elvis 操作避免可空日期类型结果。

val result: Date = formats.firstNotNullOfOrNull { format ->
    with (SimpleDateFormat(format, locale)) {
        setLenient(false)  // may not be required, see below
        parse(date, ParsePosition(0))  // is null or Date
    }
} ?: Date()

顺便说一句,setLenient(false)可能不需要,因为在 v15 上,SimpleDateFormat.parse() 文档中没有宽大处理……但它的行为确实很宽大。将其设置为trueabove 或将其省略,并解析生产日期(注意“53”)毫不留情,它产生. 抽象基类中提到了宽大处理,但没有提到."2021-07-14T53:00:00.000+0300"Fri Jul 16 02:00:00 UTC 2021nullDateFormat.parse(String, ParsePosition)SimpleDateFormat.parse(String, ParsePosition)

因此,如果您期望非模式匹配日期而不是无效但模式匹配日期,则上述循环可以简化为:

val result: Date = formats.firstNotNullOfOrNull { format ->
    SimpleDateFormat(format, locale).parse(date, ParsePosition(0))
} ?: Date()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何获取列表中的第一个值

如何在.NET中毫无例外地打印当前的堆栈跟踪?

如何在Python中以具体方式从键列表中获取第一个值?

如何从java中的列表列表中获取第一个值

如何在kotlin中获取ArrayList的最后一个值?

在Kotlin中的`let`中的`let`:如何访问第一个`it`

如何获取列表中的第一个标签?

如何删除 Kotlin 中的第一个字符

如何访问列表中的第一个值?

我如何获取数组的返回列表中的第一个索引的值

如何在python中的每个列表/元组中修改第一个值?

如何在Kotlin中换行?

如何在 java 或 kotlin 中的一行中映射一个数组列表?

如何在Kotlin中创建一个空数组?

如何在 Kotlin 中声明一个类对象

如何在 JSON 中创建一个与 Kotlin 上的列表等效的列表?

如何在kotlin中访问另一个文件中的数组列表?

如何在布尔值列表中搜索第一个真值?

如何在 Kotlin 中的一个对象中加入三个列表

在列表中合并多个Kotlin流,而无需等待第一个值

如何在flutter中获取JSON映射的第一个值?

如何在Excel数组公式中获取第一个TRUE值

如何在Python中获取第一个键值对的值

如何在Ajax响应中获取第一个元素的属性值?

如何在变量中获取python字典的第一个项目值

如何在 Kotlin 中创建对象列表?

如何在Kotlin中创建列表?

如何在Kotlin中克隆或复制列表

如何在Kotlin中获取KType?