gpt4 book ai didi

kotlin - 转换列表,过滤掉导致异常的项目

转载 作者:行者123 更新时间:2023-12-04 00:53:06 27 4
gpt4 key购买 nike

如何转换这个字符串数组:

“2018-05-08T23:22:49Z”“不适用”“2018-05-07T16:37:00Z”

使用 mapflatMapreduce 等高阶函数转换为日期数组?

我确实知道可以使用 forEach 来做到这一点,但我对涉及 Kotlin 高阶函数很感兴趣:

val stringArray
= mutableListOf("2018-05-08T23:22:49Z", "n/a", "2018-05-07T16:37:00Z")

val dateArray = mutableListOf<Date>()

stringArray.forEach {
try {
val date = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US)
.parse(it)
dateArray.add(date)
} catch (e: ParseException) {
//* Just prevents app from crash */
}
}

最佳答案

使用 mapNotNull

val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US)
val dates = listOf("2018-05-08T23:22:49Z", "n/a", "2018-05-07T16:37:00Z")
.mapNotNull {
try {
format.parse(it)
} catch (e: ParseException) {
null
}
}
println(dates)

这避免了为列表中的每个项目创建一个列表,它将错误的日期映射到 null,并且 mapNotNull 从列表中删除 null。

使用扩展函数

您还可以将 tryOrRemove 提取到扩展函数中,使代码看起来像这样:

val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US)

fun <T, U: Any> Iterable<T>.tryOrRemove(block:(T)->U): List<U> {
return mapNotNull {
try {
block(it)
} catch (ex: Throwable) {
null
}
}
}

val dates = listOf("2018-05-08T23:22:49Z", "n/a", "2018-05-07T16:37:00Z")
.tryOrRemove(format::parse)

println(dates)

使用过滤器

我已经根据唯一的错误日期 n/a 编写了它,这简化了它。

val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US)

val dates = listOf("2018-05-08T23:22:49Z", "n/a", "2018-05-07T16:37:00Z")
.filter { it != "n/a" }
.map(format::parse)

println(dates)

关于kotlin - 转换列表,过滤掉导致异常的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50249855/

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