如何在kotlin中编写递归协同程序

时间:2017-09-25 15:12:38

标签: kotlin kotlinx.coroutines

我想在kotlin中编写一个更快的文件搜索器来查找我的主文件夹下的所有文本文件。

这是我的序列搜索代码

import java.io.File
import java.util.concurrent.atomic.AtomicLong

var count: AtomicLong = AtomicLong(0)

fun main(args: Array<String>) {
  println(System.getProperty("user.home"))

  val start = System.currentTimeMillis()
  findTxtFile(System.getProperty("user.home") + "/git", ".txt")

  println("took: " + (System.currentTimeMillis() - start))

  println(count.get())
}


fun findTxtFile(path: String, extension: String) {
  File(path).listFiles().forEach {
    if (it.isDirectory) {
      findTxtFile(it.absolutePath, extension)
    } else if (it.name.endsWith(extension)) {
      count.getAndIncrement()
    }
  }
}

我编写了一个程序,但是当你有很多文件时,它会抛出NullPointerException,怎么可能抛出空指针Exception?

import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.async
import kotlinx.coroutines.experimental.runBlocking
import java.io.File

fun main(args: Array<String>) {
    val start = System.currentTimeMillis()
    var filePath = System.getProperty("user.home")
    var deferred = File(filePath).listFiles().map { path ->
        async(CommonPool) {
            findTxtFile(path.absolutePath)
        }
    }

    runBlocking {
        deferred.map {
            it.await()
        }
    }
    println((System.currentTimeMillis() - start) / 1000)
}

suspend fun findTxtFile(path: String) {
    //println("--------------------- $path")
    if (File(path).isDirectory) {
        File(path).listFiles().forEach {
            findTxtFile(it.absolutePath) //===> Exception happen here
        }
    } else if (path.endsWith(".java")) {
        println(path)
    }
}

1 个答案:

答案 0 :(得分:0)

您不需要fun findTxtFile(path: String)即可成为suspend。删除该修饰符,它将起作用。 suspend修饰符可让您在方法内部使用协程,但内部没有任何协程-因此没有必要