高效的地图和过滤器组合与stdlibs

时间:2017-04-17 22:53:36

标签: intellij-idea kotlin

我试图为常见的地图/过滤器范例编写有效的解决方案。在Kotlin中,您可以编写如下代码:

schedule.daysOfWeek.map { it.adjustInto(today) as LocalDate }
        .filterTo(datesOnSchedule) { it.isBefore(endDate) }    

通常,我应用地图,然后根据条件过滤映射的值。但是,为此创建了一个中间集合。这似乎没必要。我写了一个小功能,应该做同样的事情,但没有中间集合。

inline fun <T, R> Iterable<T>.mapThenFilter(predicate: (R) -> Boolean, transform: (T) -> R) {
    mapThenFilter(ArrayList<R>(), predicate, transform)
}

inline fun <T, R, C : MutableCollection<in R>>
    Iterable<T>.mapThenFilter(collection: C, predicate: (R) -> Boolean, transform: (T) -> R): C {
for (element in this) {
    val mapped = transform(element)
    if(predicate(mapped)) {
        collection.add(mapped)
    }
   }
 return collection
}                

但是,IntelliJ建议使用stdlib替换我的函数,使其看起来像:

    inline fun <T, R, C : MutableCollection<in R>> 
Iterable<T>.mapThenFilter(collection: C, predicate: (R) -> Boolean, transform: (T) -> R): C {
    this.map { transform(it) }
        .filterTo(collection) { predicate(it) }
    return collection
}

这将我的优化直接转换回我编写的原始代码,并重新介绍了创建多个集合的低效率。这里有一些我不知道的优化吗?

1 个答案:

答案 0 :(得分:3)

不,没有优化; IntelliJ IDEA建议旨在向您展示执行特定操作的更惯用的方式,并不总是保留原始代码的性能。显然你知道你在做什么,所以你应该忽略检查的建议或者压制它。