在Volley的背景下,Kotlin“它”的语法

有人可以向我解释这段代码中的Kotlin'it'语法是如何工作的吗? 这段代码很难阅读,有人把它发给我来解决我的问题,它对于多个连续的请求像魔术一样工作。 我之前使用过Volley,但是这个代码很混乱。 我相信Kotlin比Java更容易阅读,但是这个特殊的代码很难理解。

val responses = mutableListOf<JSONObject>() val myAPIUrl = "https://maps.googleapis.com/maps/api/distancematrix/json?units=metric&origins=" val myAPIKey = "REMOVED" val transportMode = listOf("&mode=driving", "&mode=walking", "&mode=bicycling", "&mode=transit&transit_mode=bus", "mode=transit&transit_mode=subway", "mode=transit&transit_mode=train") val queue = Volley.newRequestQueue(this) transportMode.map { "$myAPIUrl$locationCoordinatesLat,$locationCoordinatesLong&destinations=$locationInput$it&key=$myAPIKey" } .map { JsonObjectRequest(Request.Method.GET, it, null, Response.Listener { responses.add(it) }, Response.ErrorListener { //nothing }) }.forEach { queue.add(it) } } 

4 Solutions collect form web for “在Volley的背景下,Kotlin“它”的语法”

首先, transportMode列表中的每个条目映射到相同的字符串"$myAPIUrl$locationCoordinatesLat,$locationCoordinatesLong&destinations=$locationInput$it&key=$myAPIKey" ,基本上抛弃传输模式。 我们称之为A

然后,这些字符串的结果列表被映射到一个JsonObjectRequest ,在该对象中URL被设置为it ,它是列表的字符串A之一。 每个JsonObjectRequest也有成功回调和错误回调。 前者接收生成的JSONObject作为隐式的参数,所以JSONObject responses.add(it)JSONObject添加到响应列表中。

最后it可以在传递给forEach的lambda函数中找到。 它是在最后一个map step中创建的JsonObjectRequest对象之一。 lambda将它添加到Volley请求队列中。

为了使事情更清楚,我已经用一些提示扩充了你的代码:

 transportMode.map { mode -> "$myAPIUrl$locationCoordinatesLat,$locationCoordinatesLong&destinations=$locationInput$it&key=$myAPIKey" } .map { url -> JsonObjectRequest(Request.Method.GET, url, null, Response.Listener { responseJsonObject -> responses.add(responseJsonObject) }, Response.ErrorListener { //nothing }) }.forEach { request -> queue.add(request) } 

it是函数文字中使用的单个参数的隐式名称 。

例如,在您的代码中, transportMode是一个Array<String> ,当您调用时:

 transportMode.map { "..." } 

在这里你传递一个函数,它有一个String作为唯一的参数和一个String作为返回值。 所以, it里面的花括号代表一个String

如果你认为it不适合你。 你可以明确地命名参数:

 transportMode.map { tag -> "$myAPIUrl$locationCoordinatesLat,$locationCoordinatesLong&destinations=$locationInput$tag&key=$myAPIKey" } 

it是最接近的lambda的单个参数的隐式名称。

 list.forEach { queue.add(it) } // it represents current item list.forEach { item -> queue.add(item) } // Rename it if you like // first it from nestList, second from the first it nestList.forEach { it.forEach { queue.add(it) } } 

阅读更多的官方文件 。

it变量是高阶函数和Lambdas中单个参数的隐式名称 。

在第一个map()你创建了一个带有"...$it&key=$myAPIKey""结尾的模式的URL,这里就像"&mode=driving"

用第二个map()创建对urls( it用作参数)的请求,并使用responses.add(it)将侦听器中给予您的响应添加到响应列表中。

随着forEach()你迭代所有的请求,并入队这些。

  • 使用C ++支持时,Android Studio调试器不起作用
  • 在kotlin中覆盖泛型的功能
  • 蓝牙客户端Socket每次得到相同的异常
  • Kotlin VerifyError:后向分支90上存在未初始化的对象
  • 无法找到填充字段 - 使用Kotlin与房间数据库
  • 无法减少kotlin中的布尔值列表
  • 在Kotlin中使用Anko SQLite获取记录数
  • 如何将const char *转换为Kotlin / Native中的KString?
  • 在ContentResolver中使用kotlin会导致IllegalArgumentException
  • onclick在android studio中不使用kotlin响应
  • RecyclerView不可滚动,并且项目单击不在导航抽屉recyclerview中工作
  • Kotlin language will be the best programming language for Android.