Java8新特性——lambda表达式.(案例:词频统计)
需求:读入一个文本文件,确定所有单词的使用频率并从高到低排序,打印出所有单词及其频率的排序列表
先用传统方法解:
package cn._1.wordfrequency; import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /*
* Functional Thinking by Neal Ford(O'Reilly).
*/
public class Word { @SuppressWarnings("serial")
//统计除了以下单词的其他单词的使用频率
private Set<String> NON_WORDS = new HashSet<String>() {{
//匿名内部类+初始化块的初始化方式
add("the");add("and");add("of");add("to");add("a");
add("i");add("it");add("in");add("or");add("is");
add("as");add("so");add("but");add("be");
}};
public Map<String, Integer> wordFreq(String words) {
TreeMap<String,Integer> wordMap = new TreeMap<>();
Matcher m = Pattern.compile("\\w+").matcher(words);
while(m.find()){
String word = m.group().toLowerCase();
if (!NON_WORDS.contains(word)) {
if (wordMap.get(word) == null) {
wordMap.put(word, );
}else {
wordMap.put(word, wordMap.get(word)+);
}
}
}
return wordMap;
}
}
再使用Java8的新特性解:
package cn._1.wordfrequency; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /*
* Functional Thinking by Neal Ford(O'Reilly).
*/
public class Word2 {
@SuppressWarnings("serial")
private Set<String> NON_WORDS = new HashSet<String>() {{
//匿名内部类+初始化块的初始化方式
add("the");add("and");add("of");add("to");add("a");
add("i");add("it");add("in");add("or");add("is");
add("as");add("so");add("but");add("be");
}};
/*
* 使用正则表达式获得包含所有单词的List
*/
private List<String> regexToList(String words,String regex){
List<String> wordList = new ArrayList<>();
Matcher m = Pattern.compile(regex).matcher(words);
while(m.find())
wordList.add(m.group());
return wordList;
}
public Map<String, Integer> wordFreq(String words){
TreeMap<String, Integer> wordMap = new TreeMap<>();//使用TreeMap是为了使输出结果自然排序
/*
* java.util.stream.Stream:A sequence of elements supporting sequential and parallel aggregate operations.
* map:Returns a stream consisting of the results of applying the given function to the elements of this stream.
* filter:Returns a stream consisting of the elements of this stream that match the given predicate.
* forEach:Performs an action for each element of this stream.
*/
regexToList(words, "\\w+").stream()//将collection对象变为stream
.map(w -> w.toLowerCase())//返回一个经过小写处理的stream
.filter(w -> !NON_WORDS.contains(w))//过滤,使流中的元素都是NON_WORDS集合中不包含的元素
.forEach(w -> wordMap.put(w, wordMap.getOrDefault(w, )+));//遍历执行操作
return wordMap;
}
}
测试类:
package cn._1.wordfrequency; import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; public class Mmain { public static void main(String[] args) throws IOException {
String str = readText("/home/yanshaochen/workspace/Functional_Thinking_Examples/mflie/sucai.txt");
//调用老方法
/*Map<String, Integer> map = new Word().wordFreq(str);*/
//调用新方法:
Map<String, Integer> map = new Word2().wordFreq(str);
//自然排序:
for (Entry<String, Integer> item : map.entrySet()) {
System.out.println(item.getKey()+","+item.getValue());
}
//按照value进行排序(摘自网络):
/*List<Map.Entry<String, Integer>> infoIds = new ArrayList<>(map.entrySet());
Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return (o2.getValue() - o1.getValue());
//return (o1.getKey()).toString().compareTo(o2.getKey());
}
});
for (Entry<String, Integer> item : infoIds) {
System.out.println(item.getKey()+","+item.getValue());
}*/
} /*
* IO流
*/
private static String readText(String path) throws IOException {
FileInputStream fis = new FileInputStream(path);
byte[] bytes = new byte[];
int data;
String str ="";
while((data = fis.read(bytes))!=-){
str += new String(bytes, , data);
}
fis.close();
return str;
}
}
Java8新特性——lambda表达式.(案例:词频统计)的更多相关文章
- Java8新特性-Lambda表达式是什么?
目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...
- 乐字节-Java8新特性-Lambda表达式
上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...
- java8新特性——Lambda表达式
上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...
- Java8新特性 - Lambda表达式 - 基本知识
A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal param ...
- java8新特性-lambda表达式和stream API的简单使用
一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...
- Java8新特性: lambda 表达式介绍
一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...
- Java8 新特性lambda表达式(一)初始
本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...
- Java8新特性——Lambda 表达式
Lambda 表达式 Lambda 表达式的实质属于函数式编程. 语法格式为:(parameters) -> expression ...
- Java8新特性-Lambda表达式
1. 什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...
随机推荐
- EM 12c: OMS Failed to start After restarting the Repository Database or reboot of the server
原文地址:http://blog.csdn.net/wanghui5767260/article/details/39398449 更全面,更专业 EM 12c: OMS Failed to star ...
- 使用 LaTex 制作个人简历(CV,英文版)
\documentclass[12pt]{article} \textwidth=6.5in \textheight=9in \topmargin=-1.1in \headheight=0in \he ...
- 如何构造请求处理对象链(Pipeline)
在开发中,我们经常会遇到这样一个场景:传入一个对象,经过不同的节点对这个对象做不同的操作,比如ASP.NET Core 中的pipeline,IIS中的HTTPpipeline等.在这类问题中,往往我 ...
- 从零开始学习 asp.net core 2.1 web api 后端api基础框架(三)-创建Data Transfer Object
原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(三)-创建Data Transfer Object 版权声明:本文为博主原创文章,未经博主允许不得转载. ht ...
- react项目实践——(2)webpack-dev-serve
webpack-dev-server是一个小型的静态文件服务器,为webpack打包的资源文件提供Web服务.并且提供自动刷新和Hot Module Replacement(模块热替换:前端代码变动后 ...
- Ubuntu 14.04 64位字体美化(使用黑文泉驿)
Ubuntu 14.04安装和升级后,,斜体字体变得很难看,昨天,我得到一个晚上,最终,管理一个线索,这里整洁. 在线调研后,.一致的观点是,,使用开源字体库文泉驿理想的黑色字体效果,效果甚至没有丢失 ...
- 一个JSP结果页面tomcat内存溢出
如今,试验组的同事寻找新能源我看到一个奇怪的现象.一个tomcat应用,内只有一个简单的jsp页面,和这个jsp无论是什么页java代码(我想用这个jsp在她的网页测试server一对tomcat的最 ...
- hibernate关于多对多注解配置
Game实体类配置关系 @Entity @Table(name = "game") public class Game { @Id @GeneratedValue private ...
- WMWaire使用FreeNAS硬盘挂载、Raid0
FreeNAS硬盘挂载.Raid0 发表于2012 年 03 月 28 日由admin 创建成功,FreeBSD的Hardware显示状态 今天,我们将在VMware工具的帮助下,学习“FreeNAS ...
- Mvvm Light Toolkit 入门
原文:Mvvm Light Toolkit 入门 前言 之前学习UWP的时候就一直看到有关MVVM的资料但是一直没有系统的去学,最近正好有时间,特地来攻破这个点,顺便学习一下VS与GitHub的链接和 ...