在Java中使用Lambda表达式统计词频
2017-05-31 12:00
639 查看
在Java中使用Lambda表达式统计词频
常规方法
使用Java进行词频统计的常规方法步骤如下:1. 初始化一个map对象实例(用于保存单词以及它的出现次数)和一个变量fre(用于词频临时存放) 2. 遍历每一个需要统计的单词,进行如下操作 a. 将fre赋值为1 b. 判断当前单词在map中是否存在 如果存在,则将fre加上该词在map中存入词频 c. 将当前单词与fre存入map
以上步骤的代码实现如下:
Map<String, Integer> map = new HashMap<>(); int fre; for(String word : words) { fre = 1; if(map.containsKey(word)) fre += map.get(word); map.put(word, fre); }
使用Lambda表达式
在学习阅读State of the Lambda: Libraries Edition时,发现文中Collectors部分给出的最后一个代码实例存在一个小问题,即counting()方法返回的是长整型的数据类型Long,而Map却是使用Integer接收,显然是存在问题的。文中的代码实例:
Pattern pattern = Pattern.compile(\\s+"); Map<String, Integer> wordFreq = tracks.stream() .flatMap(t -> pattern.splitAsStream(t.name)) // Stream<String> .collect(groupingBy(s -> s.toUpperCase(), counting()));
而counting()方法的定义如下:
public static <T> Collector<T, ?, Long> counting() { return reducing(0L, e -> 1L, Long::sum); }
故而,需要使用自定义的counting()方法,如上,仅需要做如下修改即可:
Pattern pattern = Pattern.compile(\\s+"); Map<String, Integer> wordFreq = tracks.stream() .flatMap(t -> pattern.splitAsStream(t.name)) // Stream<String> .collect(groupingBy(s -> s.toUpperCase(), Collectors.reducing(0, e -> 1, Integer::sum)));
假设所有需要统计的单词存于List数组中,那么使用该方法进行词频统计代码如下:
// List<String> list = new ArrayList<>(); // list.add("aa a b A h z B"); // list.add("a a b A h z B"); // list.add("a a b A h z B"); // list.add("a a b A h z B"); Pattern pattern = Pattern.compile("\\s+"); Map<String, Integer> wordFreq = list.stream() .flatMap(t -> pattern.splitAsStream(t)) .collect(groupingBy(s -> s, Collectors.reducing(0, e -> 1, Integer::sum)));
在集合(List)上调用stream()生成该集合元素的流视图,然后采用将一个返回流的函数传入flatMap(),这样会产生每个单词,最后将这些词进行统计存入Map中。
相关文章推荐
- 如何在Android studio中使用java8 的Lambda表达式
- Java 8 Lambda表达式在addMouseListener中的使用
- Java 8 之 lambda 表达式简单使用入门实例代码。
- Java中Lambda表达式的使用
- idea编译出现Error:(5, 22) java: -source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)
- JAVA基础之--Lambda表达式,枚举类,垃圾回收机制,修饰符的使用范围
- 紧随时代的步伐--Java8之Lambda表达式的使用
- java8学习教程之lambda表达式的使用方法
- Android 开发使用 Java 8 中Lambda 表达式功能
- Java中Lambda表达式的使用
- Java中Lambda表达式的使用
- javaSE_8系列博客——Java语言的特性(三)--类和对象(21)--何时使用Lambda 表达式?
- Java中Lambda表达式的使用
- JAVA8之lambda表达式详解,及stream中的lambda使用
- 使用JAVA进行词频统计
- JAVA8之lambda表达式详解,及stream中的lambda使用
- Java8 Lambda表达式与Stream API (二): Stream API的使用
- 关于java中Lambda表达式的使用(粗解)
- Java 8 之 lambda 表达式简单使用入门实例代码
- 在AndroidStudio中设置某项目支持使用Java 8 新特性 ( eg:Lambda 表达式)