后续学习到网络编程、并发编程,发现JavaSE中还有个Stream流没有系统的复习
流在jdk1.8之前是IO流,jdk1.8新添加了stream特性用于处理集合
这两者是不同的
jdk1.8之前就存在流,它属于IO包(java.io),用于数据传输
IO流的使用很简单,就是调用API,重点在明白它有哪些类
有很多类型的IO流
1字符 = 2字节 、 1字节(byte) = 8位(bit)
一个汉字占两个字节,使用字符流就可以正确的传输中文
系统的输入输出(System.in,System.out)都是字节流
根据数据传输方向分为输入流、输出流
根据功能不同分为节点流、处理流
节点流(低级流)是指程序可以向一个特定的节点读写数据,直接连接数据源,常见的File流
处理流(高级流)是建立在节点流的基础上,处理流并不直接连接数据源,它大多情况是对已存在的节点流进行包装,是一种典型的装饰器设计模式。使用处理流主要是为了更方便的执行输入输出工作
首先新特性stream不像传统IO流,它是用于对集合Connection的操作
jdk1.8中,引入了Lambda和Stream
引进的Lambda的函数式编程
新特性Stream能够让用户以函数式的方式、更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算
常用方法:最简单的遍历
package com.company.javaBasis.Stream;
import java.util.LinkedList;
import java.util.List;
public class NewStream {
public static void main(String[] args){
List<Integer> list=new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
//foreach循环遍历
for(int i:list){
System.out.println(i);
}
}
}
使用stream流遍历
package com.company.javaBasis.Stream;
import java.util.LinkedList;
import java.util.List;
public class NewStream {
public static void main(String[] args){
List<Integer> list=new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
//stream流遍历
//Lambda方法引用
list.stream().forEach(System.out::println);
}
}
stream流代码更加简单优雅,stream并没有把遍历的实现算法写出,而是一种封装的形式,让我们更专注于“做什么”,而不是怎么做
stream将集合常用的操作封装,需要用时只需要调用API即可
Stream操作可以分为3步:创建流、中间操作、结束操作
java.util.stream.Stream< T> 是Java 8新加入的常用的流接口。(这并不是一个函数式接口。)
创建一个流有两种方法:
1. 集合的stream方法创建
Stream streamlist=list.stream();
streamlist.forEach(System.out::println);
2. Stream接口提供创建方法
of方法的参数是个泛型参数< T >,可以返回一个数组
Stream stream=Stream.of(list);
stream.forEach( i->System.out.println(i));
Stream stream=Stream.generate(new Supplier<Object>() {
@Override
public Object get() {
return Math.random();
}
});
stream.forEach(System.out::println);
Stream stream=Stream.iterate(1, item -> item + 1);
stream.limit(10).forEach(System.out::println);
Stream streams=Stream.empty();
中间操作就是对Stream流操作,返回的还是一个Stream
中间操作常用的方法有:
list.stream().forEach(System.out::println);
Stream.of(1,2,3,4,5).filter(i -> i>3).forEach(System.out::println);
Stream.of(1,2,3,4,5).map(i->i.doubleValue()).forEach(System.out::println);
Stream.of(1,2,3,4,5).peek(System.out::println);
Stream.of(1,2,3,4,5).peek(System.out::println).forEach(System.out::println);
中间操作还有很多API,具体运用时再查找
中间操作返回的还是stream流对象,结束操作返回的不再是Stream对象,调用了最终操作的方法,Stream才会执行
对于结束操作和中间操作的API区别:中间操作返回的是Stream流对象,结束操作返回的不是
还有很多,当然最常用的还是foreach