我一直在尝试创建一个返回 Map<String, Int>
的函数键是某个标签,值是出现次数。
我需要从中提取信息的对象(简化):
class Note {
List<String> tags
}
目前的功能:
private fun extractTags(notes: List<Note>): Map<String, Int> {
return notes.map { note -> note.tags }
.groupBy { it }
.mapValues { it.value.count() }
}
现在编译器给我的返回类型不匹配 Map<(Mutable)Set<String!>!, Int>
而且我不确定我是否得到了预期的结果(因为我仍然无法正确测试)。
我期待以下结果:
(tag1, 1)
(tag2, 4)
(tag3, 14)
...
最佳答案
您可以使用 Iterable#asSequence就像 Kotlin 中的 Java-8 stream-api 一样。然后使用 Sequence#flatMap将所有 tag
合并成一个 Sequence
,然后使用 Sequence#groupingBy对每个标签进行计数,例如:
private fun extractTags(notes: List<Note>): Map<String, Int> {
return notes.asSequence()
.flatMap { it.tags.asSequence() }
.groupingBy { it }.eachCount()
}
注意:两者都是 Sequence#flatMap和 Sequence#groupingBy是 intermediate operations ,这意味着如果 terminal operation Grouping#eachCount
不叫。 Sequence
上的所有操作都没有运行。
关于functional-programming - 使用函数式编程计算每个标签的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45282778/