废话不多说,直接上代码:
方法一:
将单词放入一个hashmap中
public static void main(String[] args) {
//创建数据源
List<String> list = new ArrayList<>();
list.add("Hello world");
list.add("Hello java");
list.add("This is a java program");
list.add("Give your program a little Spring");
list.add("So You Think You Can Dance");
list.add("Word Count");
list.add("Hello Job");
list.add("To be or not to be is a question");
//结果Map,用于存放Word和Count
Map<String, Integer> map = new HashMap<>();
//Lambda表达式
list.stream()
//flatMap方法可以将一个元素映射为一个流,然后整合,此处将一句话映射为一个word流
.flatMap(line -> Arrays.stream(line.toLowerCase().split(" ")))
//将各单词放入HashMap中
.forEach(word -> {
if (map.containsKey(word)) {
int count = map.get(word) + 1;
map.put(word, count);
} else {
map.put(word, 1);
}
});
//输出结果
map.entrySet().forEach(System.out::println);
}
方法二:
先对单词流进行排序,然后reduce进行计数
@Test
public void wordcount() {
//创建数据源
List<String> list = new ArrayList<>();
list.add("Hello world");
list.add("Hello java");
list.add("This is a java program");
list.add("Give your program a little Spring");
list.add("So You Think You Can Dance");
list.add("Word Count");
list.add("Hello Job");
list.add("To be or not to be is a question");
//临时变量,用于计数(这里用数组是因为lambda表达式内不能改变外部变量,java的闭包有缺陷)
int[] count = {1};
//Lambda表达式
list.stream()
//flatMap方法可以将一个元素映射为一个流,然后整合,此处将一句话映射为一个word流
.flatMap(line -> Arrays.stream(line.toLowerCase().split(" ")))
//将单词排序
.sorted()
.reduce("", (preWord, word) -> {
if (word.equals(preWord)) {
count[0]++;
} else if (!"".equals(preWord)) {
System.out.println(preWord + " = " + count[0]);
count[0] = 1;
}
return word;
});
}
注意两点:
第一、map和flatMap方法
前者是将一个元素映射为另一个元素,然后将新元素放入新的stream中
后者是将一个元素映射为一个stream,然后将所有stream整合为新的stream
第二、lambda表达式中无法操作修改外部变量,这应该是java对闭包支持的不够全面