【发布时间】:2018-06-04 21:48:23
【问题描述】:
我正在学习如何在 java 中使用流,我想知道将 python 计数功能复制到 java 中的最有效方法。
对于不熟悉 python 计数的人,请参阅here。
我已经完成了一个简单的实现,但我怀疑这是否会被添加到生产级环境中:
private List<String> countMessages(List<String> messages) {
Map<String, Integer> messageOccurrences = new HashMap<>();
List<String> stackedMessages = new LinkedList<String>();
this.messages.stream().filter((message) -> (messageOccurrences.containsKey(message))).forEachOrdered((message) -> {
int new_occ = messageOccurrences.get(message) + 1;
messageOccurrences.put(message, new_occ);
});
messageOccurrences.keySet().forEach((key) -> {
stackedMessages.add(key + "(" + messageOccurrences.get(key) + "times)" );
});
return stackedMessages;
}
任何改进或指针将不胜感激。
【问题讨论】:
-
这个问题更适合codereview.stackexchange.com
-
这看起来是一种复杂的方式来执行 pythons list
count()方法所做的事情。你不只是想要long count = this.messages.stream().filter((message) -> message.equals(messages)).count();吗?如果没有,请详细说明... -
@Aominè 我第一次提交问题时犯了一个错误。该函数应该获取消息列表并返回一个哈希图,其中消息作为键,它在列表中出现的次数作为值。我必须使用流来做到这一点。
-
作为一种风格说明,如果您不使用这么多大括号污染代码,您的代码将变得更具可读性。而不是
(name) -> (expression),只写name -> expression。此外,不要写(name) -> { singleMethodInvocation(); },而是写name -> singleMethodInvocation()。然后,不要遍历keySet()以在地图上为每个键执行get(),因为这不仅是视觉噪音,而且效率低下。您可以遍历entrySet()或在这里,只需使用messageOccurrences.forEach((key, value) -> stackedMessages.add(key + "(" + value + "times)" )... -
并考虑When to use LinkedList over ArrayList?(剧透:几乎从不)。
标签: java functional-programming java-stream