Почему я могу вставить код строки до DayForecast (HashMap (it)) в Котлин?

Я изучаю образец кода о Anko в Kotlin для разработчиков Android (книга) по адресу https://github.com/antoniolg/Kotlin-for-Android-Developers

Я добавлю строку var myMap=it перед DayForecast(HashMap(it)) , я думаю, что приложение выйдет из строя, потому что определение parseList является parseList(parser: (Map<String, Any?>) -> T) , я могу только назначать funtion для parseList.But приложение может работать правильно, почему?

Мой измененный прогноз ForecastDb.kt

 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 { var myMap=it DayForecast(HashMap(it)) } } 

ForecastDb.kt

 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)) } } 

DatabaseExtensions.kt

 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) }) 

Подпись функции – parseList(parser: (Map<String, Any?>) -> T) . (Map<String, Any?>) -> T) в качестве параметра означает, что функция parseList принимает в качестве аргумента тип функции с сигнатурой одного аргумента ( Map<String, Any?> ), Который возвращает T

Это пример функций более высокого порядка ).

В вашем примере вы проходите в выражении лямбда :

 .parseList { var myMap=it DayForecast(HashMap(it)) } 

В вашем лямбда-выражении вы действительно можете что-либо сделать, пока вы возвращаете тип T Вы можете вызывать несколько функций, создавать объекты, назначать переменные, что угодно, если вы возвращаете тип T в конце.

Чтобы проиллюстрировать это, предположим, что у нас есть функция, которая принимает другую функцию в качестве аргумента, которая принимает Int как параметр и возвращает Int :

 fun funTakingOne(function: (Int) -> Int): Int { return function(1) } 

Теперь один способ вызова этой функции – передать в лямбда-выражение:

 val output = funTakingOne { it + 5 } println(output) 

Выходной сигнал здесь равен 6 .

Вы также можете явно вернуть значение из лямбда с использованием квалифицированного синтаксиса возврата . Ниже приведены два идентичных вызова:

 funTakingOne { it + 2 } funTakingOne { return@funTakingOne it + 2 } 

Возвращение этого лямбда-выражения является Int . Мы также можем делать другие вещи внутри нашего выражения лямбда, пока вывод является Int :

 funTakingOne { val someCalculation: Int = expensiveCalculation(it) val otherCalculation: Int = otherCalculation(it) someCalculation / otherCalculation } 

Если вы попытаетесь вернуть что-либо иное, кроме Int , компилятор завершится с несоответствием типа:

 // This fails to compile funTakingOne { "oh no, I fail" } 

В вашем примере подпись имеет общий параметр (тип T ). Это похоже на приведенные выше примеры, за исключением того, что функция должна возвращать что-то типа T

Вот еще один надуманный пример. Функция, которая принимает функцию как аргумент, который имеет один параметр String и возвращает что-то типа T :

 fun <T> funReturnT(function: (String) -> T): T { return function("Hello World") } 

Вызов может выглядеть так:

 val output = funReturnT { "$it! Great day today!" } println(output) 

И вывод здесь Hello World! Great day today! Hello World! Great day today! , Выведенным типом output здесь является String , потому что наше лямбда-выражение возвращает String (предполагаемый тип T функции). Это то же самое, что делать следующее:

 val output: String = funReturnT { "$it! Great day today!" } println(output) 

Если мы изменим ожидаемый тип output , мы получим отказ компилятора из-за несоответствия типа.

 // This fails to compile val output: Int = funReturnT { "$it! Great day today!" } println(output)