Mutablelist的Kotlin DSL添加

时间:2019-06-10 05:19:42

标签: kotlin kotlin-dsl

这是我想在向mutableList添加更多元素时使用的可扩展功能。

fun MutableList<Field>.withFields(block: () -> Field): MutableList<Field> {
    this.add(block())
    return this
}

这是我使用该功能的方式

fun dummy(): MutableList<Field> {
        return mutableListOf<Field>().withFields {
            Field("first")
            Field("second")
            Field("last")
        }
    }

仅将最后一项添加到列表中并返回。 我该如何实现?

1 个答案:

答案 0 :(得分:0)

您已将withFields()扩展函数定义为采用返回单个Field对象的函数。该方法调用此函数,然后将它返回的对象添加到基础列表中。

然后您调用withFields(),提供一个lambda函数。对于具有多个语句的块,lambda函数的返回值的定义是该函数中最终语句的值。因此,您的lambda函数仅返回Field("last"),因为那是该函数中最后一条语句的结果。您创建的其他Field对象将被忽略。这就是为什么仅将最终值添加到目标列表的原因。

要能够通过某个函数一次添加多个项目,您需要定义一个这样的函数,该函数可以返回要添加的多个项目……就像通过返回Iterator或List一样。

更新:所以也许是这样(没有尝试运行):

fun MutableList<Field>.withFields(block: () -> List<Field>): MutableList<Field> {
    for (field in block()) {
        this.add(field)
    }
    return this
}

fun dummy(): MutableList<Field> {
    return mutableListOf<Field>().withFields {
        listOf( Field("first"),
                Field("second"),
                Field("last"))
    }
}