functional-programming - 使用函数式编程计算每个标签的出现次数

标签 functional-programming kotlin

我一直在尝试创建一个返回 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#flatMapSequence#groupingByintermediate operations ,这意味着如果 terminal operation Grouping#eachCount不叫。 Sequence 上的所有操作都没有运行。

关于functional-programming - 使用函数式编程计算每个标签的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45282778/

相关文章:

kotlin - 无法使用提供的参数调用以下函数 kotlin 错误

Android,无法从分离的 fragment 访问 ViewModel

android - 为什么我的 Android Kotlin 应用程序不请求用户的许可来打开位置?

functional-programming - Octave 中的折叠功能

java - 在 Java 中折叠顺序流

scala - 为什么 currying 和 uncurrying 不隐含在 scala 中

android - 使用相机时如何打开/关闭手电筒?

Kotlin:如何使用 @see 引用 kDoc 中的方法?

javascript - 将ramda转换为普通js

compiler-construction - 转换函数以使用尾递归-正式研究