代码HashMap(它)运行时发生了什么?

时间:2017-11-02 02:37:27

标签: kotlin

以下示例代码来自https://github.com/antoniolg/Kotlin-for-Android-Developers/blob/master/app/src/main/java/com/antonioleiva/weatherapp/data/db/ForecastDb.kt

的Kotlin-for-Android-Developers

我无法完全理解代码DayForecast(HashMap(it))。是什么"它"意思?

更重要的是,执行parseList { DayForecast(HashMap(it)) }时会发生什么?

override fun requestForecastByZipCode(zipCode: Long, date: Long) = forecastDbHelper.use {

        val dailyRequest = "${DayForecastTable.CITY_ID} = ? AND ${DayForecastTable.DATE} >= ?"
        val dailyForecast = select(DayForecastTable.NAME)
                .whereSimple(dailyRequest, zipCode.toString(), date.toString())
                .parseList { DayForecast(HashMap(it)) }
}



class DayForecast(var map: MutableMap<String, Any?>) {
    var _id: Long by map
    var date: Long by map
    var description: String by map
    var high: Int by map
    var low: Int by map
    var iconUrl: String by map
    var cityId: Long by map

    constructor(date: Long, description: String, high: Int, low: Int, iconUrl: String, cityId: Long)
            : this(HashMap()) {
        this.date = date
        this.description = description
        this.high = high
        this.low = low
        this.iconUrl = iconUrl
        this.cityId = cityId
    }
}

在下面的示例代码中,我可以理解&#34;它&#34;在代码val doubled = ints.map {it * 2 }中,&#34;它&#34;是var int的元素,例如10,20,30!

但是在代码val dailyForecast = select(DayForecastTable.NAME).whereSimple(dailyRequest, zipCode.toString(), date.toString()).parseList { DayForecast(HashMap(it)) }中,&#34;它&#34;是什么意思?

示例代码

 var  ints= listOf(10,20,30);

 val doubled = ints.map {it * 2 }


 fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
        val result = arrayListOf<R>()
        for (item in this)
            result.add(transform(item))
        return result
  }

2 个答案:

答案 0 :(得分:3)

正如Lym Zoy所说,it是闭包的单个参数的隐含名称。

如果您不熟悉Kotlin中的闭包和高阶函数,可以阅读它们here。一个带闭包/函数/ lambda的函数,基本上是需要一些帮助来完成它的工作。

我喜欢使用sortedBy作为一个很好的例子。 sortedBy是Kotlin集合库中的一个函数,它将对集合进行排序,但为了使其工作,它需要每个项目的可比属性。解决这个问题的方法是它要求您(sortedBy函数的用户)提供一个函数,该函数接受集合的成员并返回一个类似的属性。例如,如果集合是Person对象的列表,如果要按firstName,lastName或age排序,则可以为sortedBy提供不同的闭包。

这是一个快速示例,您还可以找到here,其中显示了sortedBy如何获取一个闭包参数,该参数接受一个成员并返回sortedBy可以使用的类似属性对该系列的各个成员进行排名。在第一种情况下,闭包/函数返回成员的年龄,在第二种情况下,闭包返回lastName(使用隐式形式),两者都是Comparable,Int和String。

data class Person(val firstName: String, val lastName: String, val age: Int)

fun main(args: Array<String>) {

  val people = listOf( Person("Jane", "Jones", 27), Person("Johm", "Smith", 22), Person("John", "Jones", 29))
  val byAge = people.sortedBy { person -> person.age  }  // explicit argument: person is a memeber of the List of Persons
  val byLastName = people.sortedBy { it.lastName } // implict argument: "it" is also a member of the List of Persons 
  println(people)
  println(byAge)
  println(byLastName)

}

回到具体问题的详细信息。

在您的问题中,找到的here的parseList函数定义如下:

fun <T : Any> SelectQueryBuilder.parseList(parser: (Map<String, Any?>) -> T): List<T> =
        parseList(object : MapRowParser<T> {
            override fun parseRow(columns: Map<String, Any?>): T = parser(columns)
        })

这是一个函数,它接受一个期望一个类型为Map<String, Any?>

的参数的闭包

所以在你问题中显示的电话中:

.parseList { DayForecast(HashMap(it)) }

其中{ DayForecast(HashMap(it)) }是期​​望传递给parseList的闭包,
也可以使用较长的{ arg -> DayForecast(HashMap(arg) }格式,但是短格式{ DayForecast(HashMap(it)) }是更惯用的形式,使用it作为参数可以跳过arg ->部分。

因此,在这种情况下,itparseList函数提供的Map对象。然后it引用的对象作为单独的参数传递给HashMap构造函数(这并不奇怪地期望Map),然后将该构造的结果传递给{{的构造函数1}}

答案 1 :(得分:1)

是单个参数的隐含名称。检查文档here