如何使用Kotlin高阶函数将含无效值的字符串数组转为Date数组?
嘿,我来帮你把这段forEach的代码改成更优雅的高阶函数实现~首先先提个小优化:你原来的代码里每次循环都创建SimpleDateFormat实例,这既浪费资源,而且SimpleDateFormat本身不是线程安全的,建议把它提取到循环外面复用。
下面是几种用Kotlin高阶函数的实现方案:
方案1:用mapNotNull(最直观的替代方案)
mapNotNull会遍历每个元素执行转换逻辑,自动过滤掉返回null的结果,完美对应你原来的“成功就添加,失败就忽略”的需求:
val stringArray = listOf("2018-05-08T23:22:49Z", "n/a", "2018-05-07T16:37:00Z") // 把DateFormat实例提出来复用 val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US) val dateArray = stringArray.mapNotNull { str -> try { dateFormat.parse(str) } catch (e: ParseException) { null // 解析失败返回null,会被mapNotNull自动过滤 } }
方案2:用flatMap
如果更喜欢用flatMap的逻辑,可以让每个元素返回一个单元素列表(成功时)或空列表(失败时),flatMap会自动把这些列表扁平成一个最终的Date列表:
val dateArray = stringArray.flatMap { str -> try { listOf(dateFormat.parse(str)) } catch (e: ParseException) { emptyList() } }
方案3:结合runCatching简化异常处理(Kotlin 1.8+推荐)
Kotlin的runCatching可以帮你简化try-catch的写法,把执行结果包装成Result类型,用getOrNull()就能直接拿到成功的结果或null:
val dateArray = stringArray.mapNotNull { str -> runCatching { dateFormat.parse(str) }.getOrNull() }
这个写法最简洁,代码可读性也很高~
额外说明
- 如果你需要保留原来的
mutableList类型,可以在最后加.toMutableList(),比如mapNotNull { ... }.toMutableList() - 如果你用的是Java 8+或Kotlin的现代日期API(比如
java.time下的类),更推荐用Instant.parse()来替代SimpleDateFormat,因为它是线程安全且更易用的:
(如果需要转换成import java.time.Instant val dateArray = stringArray.mapNotNull { str -> runCatching { Instant.parse(str) }.getOrNull() }java.util.Date,可以用Date.from(instant))
内容的提问来源于stack exchange,提问作者Eugene Brusov
相关产品推荐
相关产品推荐

