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

标签 java lambda java-8

有没有办法使用Stream编写以下代码?

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;
}

最佳答案

开始
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)));

关于java - 如何使用 Stream API 在 Java 8 中编写以下代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49870978/

相关文章:

java - 具有多个参数的方法如何传递给采用列表的函数?

java - 子请求的 CompletableFuture

Java:JScrollPane 不适用于 GridBagLayout

java - 以编程方式从第三方站点发送邮件

c# - Moq:如何在 linq 中调用方法谓词来模拟查询?

c++ - lambda 表达式中没有匹配的成员函数错误?

java - 在命令提示符下运行 java 代码时出现问题

java - 双向一对多 JPA org.hibernate.exception.ConstraintViolationException

javafx-2 ComboBox 转换器 : method toString(T object) not called for null values

java - 我可以让编译器忽略绑定(bind)不匹配错误吗? (或者修复它的这个实例)