面试题答案
一键面试实现思路
- 依赖引入:在Kotlin项目中引入支持HTTP请求的库,如
OkHttp
,以及协程相关依赖。 - 定义函数:创建一个函数,该函数接收URL列表作为参数。
- 异步请求:使用协程的
async
函数并发地对每个URL发起HTTP请求。async
函数会返回一个Deferred
对象,代表一个异步操作的结果。 - 获取结果:使用
await
函数等待所有异步操作完成,并获取每个请求的响应状态码。 - 构建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()
}
在上述代码中:
fetchStatusCodes
函数接收一个urls
列表,使用runBlocking
启动一个协程作用域。- 创建
OkHttpClient
实例用于发起HTTP请求。 - 使用
map
和async
对每个URL发起异步请求,返回一个Deferred
对象列表。 - 使用
map
和await
等待所有异步操作完成并获取状态码。 - 最后使用
zip
将URL和状态码组合成Map
并返回。
注意:实际应用中,需要处理可能出现的异常,如网络异常、HTTP请求失败等情况。同时,runBlocking
通常用于测试或在非协程环境中启动协程,在Android等实际应用场景中,应使用合适的协程作用域,如viewModelScope
或lifecycleScope
。