需求:读入一个文本文件,确定所有单词的使用频率并从高到低排序,打印出所有单词及其频率的排序列表

先用传统方法解:

 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表达式.(案例:词频统计)的更多相关文章

  1. Java8新特性-Lambda表达式是什么?

    目录 前言 匿名内部类 函数式接口 和 Lambda表达式语法 实现函数式接口并使用Lambda表达式: 所以Lambda表达式是什么? 实战应用 总结 前言 Java8新特性-Lambda表达式,好 ...

  2. 乐字节-Java8新特性-Lambda表达式

    上一篇文章我们了解了Java8新特性-接口默认方法,接下来我们聊一聊Java8新特性之Lambda表达式. Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作 ...

  3. java8新特性——Lambda表达式

    上文中简单介绍了一下java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习.本文就从java8新特性中比较重要的Lambda表达式开 ...

  4. Java8新特性 - Lambda表达式 - 基本知识

    A lambda expression is an unnamed block of code (or an unnamed function) with a list of formal param ...

  5. java8新特性-lambda表达式和stream API的简单使用

    一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  6. Java8新特性: lambda 表达式介绍

    一.lambda 表达式介绍 lambda 表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅. 比较官方的定义是这样的: lambda ...

  7. Java8 新特性lambda表达式(一)初始

    本篇参考Richard Warburton的 java8 Lambdas :Functional Programming for the Masses 学习lambda表达式之前,需要知道什么是函数式 ...

  8. Java8新特性——Lambda 表达式

    Lambda 表达式 ​ ​ ​ ​ ​ ​ ​ ​ Lambda 表达式的实质属于函数式编程. ​ ​ ​ ​ ​ ​ ​ ​ 语法格式为:(parameters) -> expression ...

  9. Java8新特性-Lambda表达式

    1.  什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...

随机推荐

  1. σ 代数与测度(measures)

    1. definition Let A be a collection of subsets(集合的集合体,collection of subsets) of a sample space Ω,A i ...

  2. WPF动画旋转(3轴同时旋转问题)

    原文:WPF动画旋转(3轴同时旋转问题) WPF的资料比较少,做起来不是很方便,之前一直有个XYZ3个轴同时旋转的问题,开始的时候以为通过  this.theRotateX.Axis = new Ve ...

  3. Cocostudio学习笔记(3) ImageView + Slider

    此记录使用两个控制流:ImageView 和 Slide. ---------------------------------------------------------------------- ...

  4. WPF ListView 居中显示

    原文:WPF ListView 居中显示 今天遇到的问题: 方法1:设置GridViewColumn的ActualWidth <ListView > <ListView.View&g ...

  5. 你所不知道的 Kindle - 阅读微信公众号文章

    Kindle 是一款非常优秀的阅读设备,它为我们提供了非常舒服的阅读体验,并且配合强大的亚马逊图书资源,应该是目前最好的阅读设备之一.Kindle 在已有的成就下还一直在努力提升用户体验.为中国用户开 ...

  6. 图形化界面安装oracle报错Could not execute auto check for display colors using command /usr/bin/xdpyinfo. Check if the DISPLAY variable is set.

    问题描述: 在Linux + oracle 安装时,采有root 帐号登录x-windows 界面,然后 $su oracle 登录录安装Oracle 报以下错误: >>> Coul ...

  7. SQLite 的版本问题

    原文:SQLite 的版本问题 在SQLite官方网站上的下载包真可以看花眼.不同的.net版本,还有不同的平台,开发和发布时需要加以注意. 在网上搜了搜,早有人注意到了. 关于在.Net开发中使用S ...

  8. HTTP协议-请求报文

  9. PostMessage和SendMessage有什么区别?(有EnumChildWindowsProc的例子)

    PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;而SendMessage必须等待其他程序处理消息后才返回,继续执行.PostMessage的返回值表示PostMes ...

  10. linux的自动化操作相关使用方法汇总 专题

    Crontab中的除号(slash)到底怎么用? crontab 是Linux中配置定时任务的工具,在各种配置中,我们经常会看到除号(Slash)的使用,那么这个除号到底标示什么意思,使用中有哪些需要 ...