有没有办法使用Stream
s编写以下代码?
public Map<String, Integer> process() {
List<String> words = Arrays.asList(message.toLowerCase().split("[?.\\s]+"));
Map<String, Integer> countMap = new HashMap<>();
for (String word : words) {
if (word.length() > 2) {
Integer count = countMap.getOrDefault(word, 0);
countMap.put(word, count + 1);
}
}
return countMap;
}
答案 0 :(得分:3)
从
开始Pattern.compile("[?.\\s]+").splitAsStream(message.toLowerCase())
如果你可以忍受长期结果,坚持使用Ravindra的解决方案,如果你需要int,请使用Eran的计数器。
所以:
Map<String, Long> r = Pattern.compile("[?.\\s]+").splitAsStream(message.toLowerCase())
.filter(w -> w.length() > 2)
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
或
Map<String, Integer> r = Pattern.compile("[?.\\s]+").splitAsStream(message.toLowerCase())
.filter(w -> w.length() > 2)
.collect(Collectors.toMap(Function.identity(), w -> 1, Integer::sum));
或(在下面的评论之后)(甚至更好)
Map<String, Integer> r = Pattern.compile("[?.\\s]+").splitAsStream(message.toLowerCase())
.filter(w -> w.length() > 2)
.collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(x -> 1)));
答案 1 :(得分:2)
您可以使用Collectors.toMap
生成Map
:
Map<String, Integer> countMap =
words.stream()
.filter(word -> word.length() > 2)
.collect(Collectors.toMap(Function.identity(),w -> 1, Integer::sum));
当然,您可以跳过Arrays.asList
并直接从数组中创建Stream
:
Map<String, Integer> countMap =
Arrays.stream (message.toLowerCase().split("[?.\\s]+"))
.filter(word -> word.length() > 2)
.collect(Collectors.toMap(Function.identity(),w -> 1, Integer::sum));