键入function建立者的推理

我正在使用Kotlin KBuilders和一些protobuffs,并且遇到了令我困惑的情况。

首先,我有一个函数,它需要一个文件名和序列化的JSON列表,并将这个JSON反序列化为一个protobuff。

fun parseFileData(fileName: String, lines: List): Data.Builder.() -> Unit = when (fileName) { SOME_FILE_NAME -> deserializeLinesToModel(lines, DataModel::class.java) .let { return { dataMeasurement = buildDataMeasurement { property1 = it.reduce { acc, n -> acc + n } measurementMsec = it.map { it.measurementMsec } } } } else -> throw UnsupportedOperationException() 

我不明白的第一件事就是为什么我需要在let块内的回报。 但它的工作,所以我继续前进。

后来我决定重构一些东西,使其他地方的代码变得更简单,最后得到了这样的结果:

 fun parseFileData(fileName: String, factory: DataFactory): Sequence Unit> = when (fileName) { SOME_FILE_NAME -> factory.getSomeFileSequence() // returns Sequence .batch(1000) // process data in batches of 1000 to reduce memory footprint and payload size .map { return { dataMeasurement = buildDataMeasurement { property1 = it.reduce { acc, n -> acc + n } measurementMsec = it.map { it.measurementMsec } } } else -> throw UnsupportedOperationException() 

所以基本上,我不是将每个批处理作为一个列表进行处理,而是从工厂读取序列,将其批量化为一系列列表,并尝试将每个列表映射到Data.Builder.() -> Unit 。 不过,这次我得到的return is not allowed here 。 我已经尝试了多种变化,有没有返回和地图,让和什么。 最接近的是Sequence Unit>types的返回types。

任何人都可以解释这里发生了什么? 为什么这种types不能被推断?

return map lambda是一个非本地返回。 它试图从最接近的fun函数返回,这恰好是parseFileData

非本地返回仅允许来自内联函数,其lambda参数在调用站点内联, Sequencemap扩展不是内联函数。

如果要从lambda本身返回一个值,请使用合格的return return@map ... ,或者完全省略:然后块中的最后一个expression式将作为结果返回。