如何仅映射序列中的某些项而忽略其他项

时间:2019-09-04 20:17:50

标签: kotlin functional-programming

我正在使用一种工具来帮助我浏览日志文件,并决定同时学习Kotlin。 (我是该语言的新手,所以如果这个问题显而易见,我深表歉意。)现在,我想读取一个日志文件并将每一行与几个正则表达式进行比较。根据要匹配的颜色,我想使用其他颜色。我将这些返回到UI列表中以处理显示它们

这是我当前代码中遇到的问题:

  1. 根据正则表达式检查每行两次。我想避免这种不必要的性能下降,因为这最终将处理非常大的日志文件
  2. 我需要在else语句中返回一些内容,以保持类型List<LineAndStyle>而不是变成List<Any>
fun process(file: File): List<LineAndStyle> {
    val result = file.useLines {
      it.filter { line ->
        exceptionsPattern.containsMatchIn(line) ||
          networkPattern.containsMatchIn(line) ||
          dataPattern.containsMatchIn(line)
      }.map { line ->
        when {
          exceptionsPattern.containsMatchIn(line) -> LineAndStyle(line, Color.PINK)
          networkPattern.containsMatchIn(line) -> LineAndStyle(line, Color.LIGHTBLUE)
          dataPattern.containsMatchIn(line) -> LineAndStyle(line, Color.LIGHTGREEN)
          else -> {
            LineAndStyle(line, Color.BLACK)
          }
        }
      }.toList()
    }
    return result
}

请帮助我了解Kotlin中惯用的方式。

1 个答案:

答案 0 :(得分:2)

怎么样?

fun process(file: File): List<LineAndStyle> =
    file.useLines { lines ->
        lines.mapNotNull { line ->
            when {
                exceptionsPattern.containsMatchIn(line) -> LineAndStyle(line, Color.PINK)
                networkPattern.containsMatchIn(line) -> LineAndStyle(line, Color.LIGHTBLUE)
                dataPattern.containsMatchIn(line) -> LineAndStyle(line, Color.LIGHTGREEN)
                else -> null
            }
        }.toList()
    }