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

先用传统方法解:

 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. Oracle 如何删除掉一个用户下的所有对象

    create or replace procedure drop_all as cursor cur_obj is select uo.OBJECT_NAME, uo.OBJECT_TYPE from ...

  2. Linux内核源代码情景分析-fork()

    父进程fork子进程: child = fork() fork经过系统调用.来到了sys_fork.具体过程请參考Linux内核源码情景分析-系统调用. asmlinkage int sys_fork ...

  3. Coverage数据构成

    一个Coverage数据由两个文件夹组成:一个文件夹用于存储空间几何信息,该文件夹的名称就是这个Coverage数据的名称(如下图的hnc):另一个文件夹的名字为info,它存储的为Coverage的 ...

  4. sklearn、theano、TensorFlow 以及 theras 的理解

    sklearn ⇒ 机器学习算法和模型: theras theano TensorFlow 1. 理解模型以及函数,参数返回值的实际意义 一定要注意模型的构造函数,接收的参数列表,以及该模型本身所要解 ...

  5. c#引用相等性比较(ReferenceEquals)

    Object.ReferenceEquals方法原型 public static bool ReferenceEquals( object objA, object objB) namespace T ...

  6. 1407251735-hd-美素数.cpp

    #include<stdio.h> int s1[1005000],s2[1005000]; //如果main该阵列外部函数中定义,全局变量的数组,自己主动初始化数组0: //在main里 ...

  7. C类型和存储方式的语言变量

    变量的作用域:有效射程变量 >局部变量 1.在函数中的局部变量,量在该函数结束后自己主动撤销 2.函数内的复合语句中的局部变量(比方for语句),这个变量在复合语句结束后自己主动撤销.这个变量能 ...

  8. js 小野人跟着鼠标移动

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  9. 备份一个支持虚拟化的wrappanel

    public class VirtualizingWrapPanel : VirtualizingPanel, IScrollInfo { #region Fields UIElementCollec ...

  10. 【必须知道】Enum_Flags

    [Flags] enum AnyThings{ A=1, B=2, C=4, D=8 } 枚举赋值必须是2^n才可以,目的是实现他们的二进制表示中的 1 ,不要重叠,如 1=0001   2=0010 ...