我有这样的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
构造函数(