首页 > 解决方案 > Kotlin:查找列表的最大日期列表

问题描述

在 kotlin 中考虑:

     data class classA (
      field1
      field2
      ....
       classBlst:List<classB>
      )

      data class classB (
       field3
       field4
       ...
      dateField:String
      )

问题是通过 List 循环,在 classBlst 中找到最大的 dateField,并返回该项目的相应 field3。dateField 是一个字符串,可能包含空值和错误日期,因此需要尝试..catch。

我可以建立一个包含所有最大日期的列表,然后在该列表上进行第二次迭代以找到最大值。我可以使用迭代器来做到这一点,但要寻找任何 lambda 函数式的方法来做同样的事情。对不起,这一切都是新手。

标签: kotlin

解决方案


鉴于:

data class ClassA(val list: List<ClassB>)
data class ClassB(val field3: Int, val dateField: String? = null)

您可以使用 mapNotNull 获取最新日期,您将在其中格式化日期并在遇到异常时返回 null。

然后在包含格式化日期的字段上使用 maxBy 在您在上一个 mapNotNull 中创建的新对象中

我选择使用 Pair 因为看起来您只需要一个过滤器并且不想保留新创建的对象。但如果不是这种情况,请考虑创建一个包含所有所需信息的新类。

val a = ClassA(
    listOf(
        ClassB(0, "24"),
        ClassB(1, "24/03/1987"),
        ClassB(2),
        ClassB(3, "24/03/2024")
    )
)

val res = a.list
    .mapNotNull {
        val dateFormater = DateTimeFormatter.ofPattern("dd/MM/yyyy")
        try {
            Pair(it.field3, LocalDate.parse(it.dateField, dateFormater))
        } catch (e: Exception) {
            null
        }
    }
    .maxBy { it.second }

推荐阅读