我可能错过了一些非常明显的东西:如何有效地过滤和迭代 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
的懒惰不是免费提供的:它引入了一些开销,如果仅在性能关键型代码中运行小型集合的简单转换,则开销可能会变得相当可观。