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

我试图写一个有效的解决方案,以通用的地图/过滤器范例。 在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 } 

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

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