Kotlin:如何将所有列表元素应用于对象



我有这样的kotlin代码。我写得不是很优雅,但它写得很正确。如何使用kotlin工具将其写得更漂亮?

我需要将filters列表中的所有元素应用到query对象。

fun create(filters: List<FilterFactory.Filter>, searchQuery: SearchQuery): Query {
var query = Query()
filters.forEach { filter -> query = filter.apply(query) }
return query
}

您可以使用fold重构函数的实现:

fun create(filters: List<FilterFactory.Filter>): Query =
filters.fold(Query()) { q, f -> f.apply(q) }

注意,您的初始代码没有使用searchQuery参数,所以我删除了它

至于API,您可能希望使用扩展函数,并使用toX()约定作为名称。例如:

fun List<FilterFactory.Filter>.toQuery(): Query =
fold(Query()) { q, f -> f.apply(q) }

不过,过滤器列表中的toQuery()可能会让一些人感到困惑。也许更好的方法是对Query本身进行扩展:

fun Query.withFilters(filters: List<FilterFactory.Filter>): Query =
filters.fold(this) { q, f -> f.apply(q) }

然后要使用它,您需要在调用站点上提供初始Query实例:

val filteredQuery = Query().withFilters(filters)

您可以做的另一件事是简单的apply调用来配置您创建的对象:

fun create(filters: List<FilterFactory.Filter>, searchQuery: SearchQuery): Query {
return Query().apply { 
filters.forEach { filter -> filter.apply(this) }
}
}

这很好地适用于单一表达风格的

fun create(filters: List<FilterFactory.Filter>, searchQuery: SearchQuery) =
Query().apply { 
filters.forEach { filter -> filter.apply(this) }
}

(我假设您在某个地方使用searchQuery,例如Query构造函数(

最新更新