【问题标题】:Can I combine the builder pattern with a lambda expression?我可以将构建器模式与 lambda 表达式结合起来吗?
【发布时间】:2019-12-02 20:25:44
【问题描述】:

以下 lambda 表达式对在 lambda 之外创建的类进行操作。 我认为这很笨拙。有没有更好的方法?

class Builder {
    var searchTerms = listOf<String>()
    fun build(whatever: String): Builder {
        searchTerms = searchTerms +  whatever
        return this
    }
}

fun main() {
   val b = Builder()
   val toSearch = listOf<String>("Anna", "Berta", "Carla")
   toSearch.forEach{ e-> b.build(e)}
}

【问题讨论】:

  • 可能值得指出的是,构建器在 Kotlin 中的使用并不多,在 Kotlin 中,可以使构造器参数可选并提供默认值,这意味着单个构造器通常可以完成以下工作一个完整的建设者。 (类似地,当你有函数构造和 with 函数时,方法每次都返回 this 的“流畅”风格并不是那么需要。)
  • 对于在一个对象上设置一堆参数的构建器来说确实如此。我不确定一个增长的对象(如上)是否符合 Builder 模式。如果上面的例子是一个不可变的类,它返回一个带有附加数据的副本,它就像 CoroutineContext 一样。不知道这个模式有没有名字。

标签: kotlin lambda functional-programming builder-pattern


【解决方案1】:

不完全确定你认为它有什么笨拙之处,但如果你必须为临时变量创建一个不同的行,你可能会认为这个更干净:

fun main() {
    val toSearch = listOf<String>("Anna", "Berta", "Carla")
    val b = toSearch.fold(Builder()) { builder, e -> builder.build(e) }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多