使用Java 8聚合操作处理IO流
来源:互联网 发布:亚马逊大数据应用 编辑:程序博客网 时间:2024/05/16 10:53
如何使用Java 8的聚合操作(Stream)处理IO流
目前只研究了java.io.*的相关操作,对于nio暂时没有研究
Oracle在2014年发布了Java 8。Oracle在该版本中添加了许多新特性,包括Lambda表达式、方法引用、加强了安全等等。聚合操作(Aggregate> Operations)也是一个重大的特色。
一般Aggregate Operations(聚合操作)也被称作流。一般被用于集合(Collection)的处理上,如配合lambda表达式,可以简单的通过如以下代码可以实现快速的排序并输出功能。
list.stream().sorted().forEach(System.out::println)
在此说明聚合操作的效率,目前开来,不一定比使用传统的方法有速度上的优势,但是其在一行代码中可以实现诸多操作,并且思路清晰易懂的特点,完全可以“秒杀”传统方式。当需要修改代码时,非常方便的定位到要修改的部分。
说重点
本文主要介绍聚合操作超高效处理文本文件的IO。以作者实现的从批量文件中读取文本并统计单词为例。
* 直接上干货
Stream.of(readers).flatMap(f->f.lines()) .flatMap(line -> Stream.of(line.split("\\W"))). distinct().sorted().forEach(System.out::println);
其中readers是已经打开的BufferedReader对象的一个数组
那么为什么用Reader数组呢,因为不知道流会不会自动关闭打开的文件,为了防止没有关文件,希望有验证了的童鞋告诉我(我觉得可能会关闭,只是猜测)。如果不考虑关闭的影响的话,完全可以这样。
Stream.of(fileNames).map(FileReader::new).map(BufferedReader::new) .flatMap(f->f.lines()).flatMap(line -> Stream.of(line.split("\\W"))). distinct().sorted().forEach(System.out::println);
可以想象如果用传统的方式要怎么处理:
Set set = new TreeSet(); for(String fileName : files){ BufferedReader reader = new BufferedReader(new FileReader(fileName)); String l; while((l = reader.readLine()) != null){ set.addAll(Arrays.asList(l.split("\\W"))); } reader.close(); } set.forEach(System.out::println);
那么问题来了那现在我要修改成统计每个单词出现的频率,对于传统方式基本上要来一次大手术。而对于聚合操作,请看大招
HashMap<String,Integer> map = Stream.of(readers).flatMap(f->f.lines()). flatMap(line -> Stream.of(line.split("\\W"))) .collect(HashMap::new,(m,word) -> m.compute(word,(k,v)->v==null?1:v+1),HashMap::putAll );
传统方式要怎么改呢?。。。。想想都头大!
总结
其实就是BufferedReader里面有个lines可以生成一个以每行为元素的Stream。
0 0
- 使用Java 8聚合操作处理IO流
- JAVA IO操作总结:节点流和处理流
- JAVA IO操作总结:节点流和处理流
- JAVA IO操作总结:节点流和处理流
- JAVA IO处理流
- Java IO流处理
- JAVA IO 流操作
- java io流操作
- java IO流操作
- java IO 流操作
- java笔记-IO流-IO基本操作
- java IO操作之IO流介绍
- java-IO操作——使用字节流读写数据
- java-IO操作-使用字符流读写数据
- Java IO操作——合并流SequenceInputStream的使用
- java面试题之使用IO字符流操作文本文件
- IO操作 IO异常处理
- Java的IO流操作
- 基本算法-将功赎过
- java的枚举
- k-近邻算法的基本实现
- 黑白棋经典残局(3)
- 【Linux 内核网络协议栈源码剖析】listen 函数剖析
- 使用Java 8聚合操作处理IO流
- HDU ACM 11 2042 不容易系列之二
- C/C++ Windows API——文件/文件夹创建、删除、移动及查看时间
- 关于论文组会的一些思考(其一)
- 使用hibernate自动创建数据库表格为啥产生两个中间表
- 用java输出正方形,等腰三角形,直角三角形
- 关于Android 5.0 的新特性
- [从头学绘画] 第27节 基本姿式-趴势
- codeforces-368