MST

星途 面试题库

面试题:Kotlin函数式编程与并发结合

假设你有一个包含1000个URL的列表,你需要使用Kotlin的函数式编程风格和协程并发机制,对每个URL发起HTTP请求,并获取响应状态码。要求使用异步操作,提高效率,避免阻塞主线程,最后返回一个包含所有URL及其对应状态码的Map。请详细说明实现思路,并给出关键代码片段。
33.8万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 依赖引入:在Kotlin项目中引入支持HTTP请求的库,如OkHttp,以及协程相关依赖。
  2. 定义函数:创建一个函数,该函数接收URL列表作为参数。
  3. 异步请求:使用协程的async函数并发地对每个URL发起HTTP请求。async函数会返回一个Deferred对象,代表一个异步操作的结果。
  4. 获取结果:使用await函数等待所有异步操作完成,并获取每个请求的响应状态码。
  5. 构建Map:将URL和对应的状态码构建成一个Map并返回。

关键代码片段

import okhttp3.OkHttpClient
import okhttp3.Request
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking

fun main() {
    val urls = List(1000) { "https://example.com/$it" }
    val result = fetchStatusCodes(urls)
    println(result)
}

fun fetchStatusCodes(urls: List<String>): Map<String, Int> = runBlocking {
    val client = OkHttpClient()
    val deferreds = urls.map { url ->
        async {
            val request = Request.Builder()
               .url(url)
               .build()
            client.newCall(request).execute().code
        }
    }
    val statusCodes = deferreds.map { it.await() }
    urls.zip(statusCodes).toMap()
}

在上述代码中:

  1. fetchStatusCodes函数接收一个urls列表,使用runBlocking启动一个协程作用域。
  2. 创建OkHttpClient实例用于发起HTTP请求。
  3. 使用mapasync对每个URL发起异步请求,返回一个Deferred对象列表。
  4. 使用mapawait等待所有异步操作完成并获取状态码。
  5. 最后使用zip将URL和状态码组合成Map并返回。

注意:实际应用中,需要处理可能出现的异常,如网络异常、HTTP请求失败等情况。同时,runBlocking通常用于测试或在非协程环境中启动协程,在Android等实际应用场景中,应使用合适的协程作用域,如viewModelScopelifecycleScope