[英]What is the best way to implement a generic range as a function argument in Java?
[英]What is the best way to implement the python count function in java?
我正在学习如何在Java中使用流,并且我想知道将python count功能复制到Java中的最有效方法。
对于不熟悉python计数的人,请参见此处 。
我已经完成了一个简单的实现,但是我怀疑这是否会添加到生产级环境中:
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;
}
任何改进或指针将不胜感激。
要回答“在Java中实现python count函数的最佳方法是什么?”的问题。
Java已经有Collections.frequency可以做到这一点。
但是,如果您想使用流API来做到这一点,那么我相信通用解决方案将是:
public static <T> long count(Collection<T> source, T element) {
return source.stream().filter(e -> Objects.equals(e, element)).count();
}
那么用例将是:
long countHellp = count(myStringList, "hello");
long countJohn = count(peopleList, new Person("John"));
long count101 = count(integerList, 101);
...
...
或者,如果您愿意,甚至可以传递谓词:
public static <T> long count(Collection<T> source, Predicate<? super T> predicate) {
return source.stream().filter(predicate).count();
}
然后,用例将是:
long stringsGreaterThanTen = count(myStringList, s -> s.length() > 10);
long malesCount = count(peopleList, Person::isMale);
long evens = count(integerList, i -> i % 2 == 0);
...
...
鉴于您对帖子的评论,您似乎想对它进行“分组”并获得每个分组的计数。
public Map<String, Long> countMessages(List<String> messages) {
return messages.stream()
.collect(groupingBy(Function.identity(), counting()));
}
这将从messages
列表中创建一个流,然后对其进行分组,并传递counting()
作为下游收集器,这意味着我们将检索Map<String, Long>
,其中键是元素,值是该特定字符串的出现。
确保您已导入:
import static java.util.stream.Collectors.*;
对于后一种解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.