在 Kotlin 中过滤和处理哈希映射条目



我可能错过了一些非常明显的东西:如何有效地过滤和迭代 Kotlin 中 HashMap 的条目?

我想执行以下操作:

myMap.filterValues{ someCondition }.forEach { doSomethingWithTheEntry }

如何避免创建中间对象?filterValues 将创建一个 HashMap,这在这里并不是真正需要的。

我当然可以写

myMap.forEach { if(someCondition) doSomethingWithTheEntry }

但功能风格的过滤器方法看起来更优雅。

为了避免存储中间值,你可以使用 Sequence ,这有点像Iterable的懒惰等价物(有关详细信息,请参阅另一个 Q&A(。

要将Map的条目作为Sequence进行处理,请使用.asSequence()对其进行转换(同样,不会创建中间集合(,然后在序列上使用.filter { ... }.forEach { ... }

myMap.asSequence().filter { someCondition(it) }.forEach { doSomething(it) }

这将创建一个管道,该管道将逐个查询条目,检查条目上的谓词,如果匹配,则运行操作,而不存储中间值。

但是,效率取决于集合大小和操作的复杂性,因为Sequence的懒惰不是免费提供的:它引入了一些开销,如果仅在性能关键型代码中运行小型集合的简单转换,则开销可能会变得相当可观。

最新更新