如何使用Stream API在Java 8中编写以下代码?

时间:2018-04-17 06:06:58

标签: java lambda java-8

有没有办法使用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;
}

2 个答案:

答案 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));