lambdas转换中的kotlin对象转换

时间:2018-08-17 15:15:50

标签: kotlin

我正在尝试进行以下编译:

val criteriaList = aList.stream().map { dateRange -> {
            Criteria.where("KEY").`is`(dateRange) } }.toList().toTypedArray()

Criteria().orOperator(*criteriaList)

但是:

Criteria().orOperator(*criteriaList)

当前无法编译:

Type mismatch.
Required:
Array<(out) Criteria!>!
Found:
Array<(() → Criteria!)!>

为什么?

1 个答案:

答案 0 :(得分:2)

您正在将dateRange映射到() -> Criteria。 您无需使用花括号将->之后的内容括起来。还要检查Kotlin reference regarding Lambda expression syntax

  

val sum = { x: Int, y: Int -> x + y }

     

lambda表达式始终被花括号[...]包围,主体在->符号之后。如果lambda的推断返回类型不是   Unit,lambda主体内的最后一个(或可能是单个)表达式被视为返回值。

因此,您可以只编写以下内容:

.map { dateRange -> Criteria.where("KEY").`is`(dateRange) }

还请注意,您实际上并不需要呼叫stream(),但可以直接在其上呼叫map(除非它不是真正的List

因此您的代码可能会简化为:

val criteriaList = aList.map { dateRange -> Criteria.where("KEY").`is`(dateRange) }
                        .toTypedArray()

val criteriaList = aList.map { Criteria.where("KEY").`is`(it) }
                        .toTypedArray()