1. 流的作用

通过使用流,说明想要完成什么任务,而不是说明如何去实现它,将操作的调度留给具体实现去解决;

实例:假如我们想要计算某个属性的平均值,那么我们就可以指定数据源和属性,然后,流库就可以对计算进行优化;

1.1. 从迭代到流的操作

1.1.1. java.nio.file深度剖析

从java.nio.file提供的功能不难看出已经可以替换java.io.file所提供的功能;

1.1.1.1. java.nio.file的主要功能

1:对文件系统本身的操作,例如文件的复制,移除,删除,创建功能,创建软连接。

2:对文件系统的属性的进行操作,例如查看或修改 文件属性、操作权限、所属用户或用户组、最后修改时间,查看文件是否隐藏、文件的长度。

3:对文件系统进行遍历。

4:使用nio的方式查看和改变文件内容。

5:对文件或文件夹的创建,删除,修改事件进行监控。

1.1.1.2. java.nio.file提供常用方法

1:复制文件

copy(Path source,Path target,CopyOption... options) throws IOException

2:创建目录

createDirectories(Path dir,FileAttribute<?>... attrs) throws IOException

3:创建文件,path代表文件路径

createFile(Path path,FileAttribute<?>... attrs) throws IOException

4:创建连接,link代表目标连接,existing代表一个存在的文件

createLink(Path link,Path existing)throws IOException

5:删除文件

delete(Path path); deleteIfExists(Path path)

6:获取文件的BufferReader,BufferWriter

newBufferedReader(Path path, Charset cs), newBufferedWriter(Path path, Charset cs, OpenOption... options)

7:获取文件的InputStream,OutputStream

newInputStream(Path path, OpenOption... options),newOutputStream(Path path, OpenOption... options)

8:以字节和字符串形式读取文件

readAllBytes(Path path),readAllLines(Path path, Charset cs)

1.1.2. 实例

需求:对文档中的长单词进行计数

1.1.3. 传统方法

 import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List; /**
* Created by Lenovo on 2017/12/14.
* 对文件中的长单词进行计数
*/
public class Demo01 { private static final String filePath = "G:\\Idea\\src\\com\\itheima05\\Test_JavaSE\\Test_20171214\\word.txt"; public static void main(String[] args) throws Exception { //使用集合的方法实现
String contens = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
String[] ws = contens.split("\\PL+");
//将数组转化为List集合
List<String> words = Arrays.asList(ws);
int count = 0;
for(String word:words){
if(word.length()>6){
count ++;
}
}
System.out.println(count);
}
}

1.1.4. 使用流处理

java.util.Collection<E>:

default Stream<E> stream()   -----  产生当前集合中所有元素的顺序流

default Stream<E> parallelStream()   -----  产生当前集合中所有元素的并行流

 import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List; /**
* Created by Lenovo on 2017/12/14.
* 使用流对文档中的长单词进行计数
*
*/
public class Demo02 { private static final String filePath = "G:\\Idea\\src\\com\\itheima05\\Test_JavaSE\\Test_20171214\\word.txt"; public static void main(String[] args) throws Exception { String contents = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8); String[] ws = contents.split("\\PL+");
//将数组转化为集合
List<String> words = Arrays.asList(ws);
//使用流
//Stream<T> filter(Predicate<? super T> predicate) 产生一个流,其中包含当前流中满足P的所有元素
//long count() 产生当前流中元素的数量,这个是一个终止操作
long count = words.stream()
.filter(w -> w.length() > 6)
.count();
System.out.println("顺序流输出:"+count); long count02 = words.parallelStream()
.filter(w -> w.length()>6)
.count();
System.out.println("并行流输出:"+count02); }
}

流的主要思想是:做什么而非怎么做;

以上实例:需要统计文档中的长度为6的单词

1.1.5. 流和集合的区别

1:流并不存储其元素;

2:流的操作不会修改其数据源

3:流的操作是尽可能惰性执行的

1.1.6. 流的操作流程

1:创建一个流

2:指定将初始流转化为其他流的中间操作,可能包含多个步骤(filter,产生新的流);

3:应用终止操作,从而产生结果

1.2. 流的创建

static <T> Stream<T> of(T... values)                                        返回一个元素为给定值的流

static <T> Stream<T> empty()                                                 返回一个不包含任何元素的流

Optional<T> findFirst()                                                             返回描述此流的第一个元素的可选项,如果流为空,则返回一个空的可选项。 如果流没有遇到命令,则可以返回任何元素。

static <T> Stream<T> generate(Supplier<T> s)                      返回无限顺序无序流,其中每个元素由提供的供应商生成。 这适用于生成恒定流,随机元素流等。

static <T> Stream<T> iterate(T seed,UnaryOperator<T> f)    返回一个由函数f迭代应用到初始元素种子产生的无限序列有序流,产生由种子,f(种子),f(f(种子))等组成的流。Stream中的第一个元素(位置0)将是提供的种子。 对于n> 0,位置n处的元素将是对位置n-1处的元素应用函数f的结果。

java.util.regex.Pattern

public static Pattern compile(String regex)                              将给定的正则表达式编译成模式。

public Stream<String> splitAsStream(CharSequence input)   根据给定的输入序列,围绕此模式的匹配创建一个流。

Java.util.File.Files

public static Stream<String> lines(Path path,Charset cs) throws IOException   从文件中读取所有行作为Stream。 与readAllLines不同,此方法不会将所有行读取到List中,而是在流被消耗时延迟地填充。

 /**
* Created by Lenovo on 2017/12/16.
* static <T> Stream<T> of(T... values)
* 产生一个元素为给定值的流
*/
public class Demo03 { private static final String filePath = "G:\\Idea\\src\\com\\itheima05\\Test_JavaSE\\Test_20171214\\word.txt"; public static void main(String[] args) throws Exception { String contents = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
//创建流(传入一个数组)
Stream<String> words = Stream.of(contents.split("\\PL+"));
long count = words.filter(w -> w.length() > 6)
.count();
System.out.println(count); //of方法具有可变长参数
Stream<String> song = Stream.of("gently", "down", "the", "stream");
//取流中的第一个元素
String word = song.findFirst().get();
System.out.println(word); //创建不包含任何元素的流
Stream<String> empty = Stream.empty();
List<String> list = empty.limit(1).collect(Collectors.toList());
if(list.isEmpty()) {
System.out.println("list为空");
} //生成恒定流
Stream<String> sg = Stream.generate(() -> "Echo");
String s = sg.findFirst().get();
System.out.println("恒定流:"+s); //生成一个随机流
Stream<Double> sgr = Stream.generate(Math::random);
Double dr = sgr.findFirst().get();
System.out.println("随机流"+dr); //产生无限序列
final int SIZE = 10;
Stream<BigInteger> si = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));
List<BigInteger> NumList = si.limit(SIZE + 1).collect(Collectors.toList());
for(int i = 0;i<NumList.size();i++){
System.out.println(NumList.get(i));
}
}
}

1.2.1. 实例

1.2.1.1. 问题1

public <T> void show(T t),void前面的泛型T是什么作用

public <T>这个T是个修饰符的功能,表示是个泛型方法,就像有static修饰的方法是个静态方法一样。

<T> 不是返回值,表示传入参数有泛型

public static <T>list<T> aslist(T...a)

第一个表示是泛型方法,第二个表示返回值是list类型,而这个list有泛型,只能存t类型的数据

1.2.1.1. 具体实例

 public class Dem04 {
private static final String filePath = "G:\\Idea\\src\\com\\itheima05\\Test_JavaSE\\Test_20171214\\word.txt";
public static <T> void show(String title,Stream<T> stream){ final int SIZE = 10;
List<T> tList = stream.limit(SIZE + 1)
.collect(Collectors.toList());
System.out.print(title+":");
for(int i=0;i<tList.size();i++){
if(i>0){
System.out.print(",");
}
if(i<SIZE){
System.out.print(tList.get(i));
}else{
System.out.print(".....");
}
}
System.out.println();
}
public static void main(String[] args) throws Exception { String contents = new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8); Stream<String> words = Stream.of(contents.split("\\PL+"));
show("words",words); Stream<String> song = Stream.of("gently", "down", "the", "stream");
show("song",song); Stream<String> silence = Stream.empty();
show("silence",silence); Stream<String> generate = Stream.generate(() -> "Eche");
show("generate",generate); Stream<Double> randomNum = Stream.generate(Math::random);
show("randomNum",randomNum); Stream<BigInteger> iterate = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));
show("iterate",iterate); Stream<String> ss = Pattern.compile("\\PL+").splitAsStream(contents);
show("ss",ss); Stream<String> linesStream = Files.lines(Paths.get(filePath), StandardCharsets.UTF_8);
show("linesStream",linesStream);
}
}

输出结果:

 words:In,my,dual,profession,as,an,educator,and,health,care,.....
song:gently,down,the,stream
silence:
generate:Eche,Eche,Eche,Eche,Eche,Eche,Eche,Eche,Eche,Eche,.....
randomNum:0.8545074280087089,0.05768740015609908,0.34845089835617316,0.9804483156381134,0.7893443687111327,0.5534594948929666,0.10749904759731743,0.32867498853912414,0.6739155442072872,0.6897019997934322,.....
iterate:0,1,2,3,4,5,6,7,8,9,.....
ss:In,my,dual,profession,as,an,educator,and,health,care,.....
linesStream:In my dual profession as an educator and health care provider,,I have worked with numerous children infected with the virus,that causes AIDS. The relationships that I have had with these,special kids have been gifts in my life. They have taught me so,many things, but I have especially learned that great courage,can be found in the smallest of packages. Let me tell you about Tyler.

Java SE 8 流库的更多相关文章

  1. Java SE 8 流库(一)

    1. 流的作用 通过使用流,说明想要完成什么任务,而不是说明如何去实现它,将操作的调度留给具体实现去解决: 实例:假如我们想要计算某个属性的平均值,那么我们就可以指定数据源和属性,然后,流库就可以对计 ...

  2. Java SE 8 流库(二)

    1.3. filter,map,flatMAP方法 流的转换会产生一个新流,它的元素派生出自另一个流中的元素: Stream<T> filter(Predicate<? super ...

  3. Java SE 8 流库(四)

    1.8. 收集数据 <R,A> R collect(Collector<? super T,A,R> collector)   使用给定的收集器来收集当前流中的元素 void ...

  4. Java SE 8 流库(三)

    1.7. Optional类型 容器对象,可能包含或不包含非空值.如果存在一个值,isPresent()将返回true,get()将返回值.还提供了依赖于包含值是否存在的附加方法,如orElse()( ...

  5. 第01章-Java SE8的流库

    从迭代到流的操作 流表面上看起来和集合很类似,都可以让我们转换和获取数据,但是它们之间存在着显著的差异 流并不存储其元素,这些元素可能存储在底层的集合中,或者是按需生成的 流的操作不会修改其数据源 流 ...

  6. Java高级特性1_流库_初体验

    Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...

  7. Java SE 8 的流库学习笔记

    前言:流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图.如: //使用foreach迭代 long count = 0; for (String w : words) { if (w. ...

  8. 转自知乎(JAVA后台开发可以纯粹用JAVA SE吗?)

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:巴多崽链接:http://www.zhihu.com/question/29663744/answer/45154839来源: ...

  9. 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结

    虽然看过一些Java 8新特性的资料,但是平时很少用到,时间长了就忘了,正好借着Java 9的发布,来总结下一些Java 8中的新特性. 接口中的默认方法和静态方法 先考虑一个问题,如何向Java中的 ...

随机推荐

  1. 异常详细信息: Abp.AbpException: No language defined!

    程序运行后,出现错误:No language defined! 解决方法: 1.检查是否已创建数据库,若未创建则在程序包管理控制台执行命令:Update-Database 2.检查表AbpLangua ...

  2. .NET在VS2008中生成DLL并调用

    1.生成DLL 打开VS2008 - >新建->项目->类库->ClassLibrary1,在ClassLibrary1中会自动创建一个Class1类 class1中加入代码如 ...

  3. 【Win 10 应用开发】UI Composition 札记(二):基本构件

    在上一篇中,老周用一个示例,演示了框架视图的创建过程,在本篇中,老周将给大伙伴们说一下 Composition 构建 UI 的一些“零件”. UI Composition 有一个核心类——对,就是 C ...

  4. Red and Black

    Problem Description There is a rectangular room, covered with square tiles. Each tile is colored eit ...

  5. js中的事件缓存机制

    异步任务指的是,不进入主线程.而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行. ...

  6. js和jquery实现监听键盘事件

    一.使用javascript实现 <!DOCTYPE html> <html> <head> <meta charset="utf-8"& ...

  7. Cocoapods使用过程中遇到的问题

    前言:记录一些在CocoaPods使用过程中遇到的问题,本地环境:Xcode9.0 发现有的时候在执行pod init的时候不能正常地创建出来pod File文件,显示的错误如下: ――― MARKD ...

  8. linux-mv

    linux-mv 主要用于文件或者目录的移动或者改动, 命令参数 -i:ruguo目标文件或者目录存在,提示是否覆盖目标文件或目录 -f:无论目标文件是否存在,直接覆盖,不提示, 有好多参数,自己可以 ...

  9. EasyUI扩展验证

    1.首先在jquery.easyui.min.js下最后插入下面代码 $.extend($.fn.validatebox.defaults.rules, { idcard : {// 验证身份证 va ...

  10. 基于Cef内核的多店铺登录器(含源码)

    公司是做电商的,在速卖通平台上开了若干店铺,每天都需要登录店铺打理,如:发货提交.获取运单号等.多个店铺的情况下,同时使用浏览器就会非常繁琐,如:要记住帐户名和密码,还要在不同店铺间切换.如果能够制作 ...