一.Stream特性
- 没有存储功能,不是存储元素的数据结构
- 对操作流进行操作获得结果,不影响源数据流
- 惰性操作,如(Filter、map操作符)
- 流可以是无限流,而集合是有限
- 对调用了终止操作符的流,无法再次操作或访问该流,需要重新创建新流
- 四种操作流:
- Stream
- IntStream
- DoubleStream
- LongStream
-
流的操作可以分为 中间 操作和 终端 操作
-
中间操作:创建一个新流进行一系列操作转换并返回该新流
- 有状操作:处理元素时保留看到先前的元素状态,比如 distinct() 去重,sort() 排序等
- 无状操作:处理元素时不保留先前的元素状态,每个元素都是独立操作,比如 map() 等 -
终端操作:执行该操作之后,认为该流就被消耗,如果再次操作该流需要重新返回新流,否则将会报告如下错误:
Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
2.后续使用到的Java类
public class Person { private int age; private String name; public int getAge() { return age;} public void setAge(int age) { this.age = age;} public String getName() { return name;} public void setName(String name) { this.name = name;} public Person(int age, String name) { this.age = age;this.name = name;} public Person() { } public String toString() { return "Person[" + "age=" + age + ", name='" + name + '\'' + ']'; } public static ArrayList<Person> getPersonsList() { ArrayList<Person> arrayList = new ArrayList<>(); Person bill = new Person(20, "Bill"); Person cancel = new Person(25, "Cancel"); Person smith = new Person(28, "Smith"); Person hanery = new Person(33, "Hanery"); Person jerk = new Person(38, "Jerk"); Person danvil = new Person(42, "Danvil"); arrayList.add(bill); arrayList.add(cancel); arrayList.add(smith); arrayList.add(hanery); arrayList.add(jerk); arrayList.add(danvil); return arrayList; } }
-
二.创建Stream的方式
-
通过**Collection**集合创建流对象
Collection接口中定义了default Stream方法
public interface Collection<E> extends Iterable<E> { // ...... // default Stream<E> stream() { return StreamSupport.stream(this.spliterator(), false); } //创建并行流 default Stream<E> parallelStream() { return StreamSupport.stream(this.spliterator(), true); }
示例:使用 ArrayList 集合创建 Stream 流
Stream<Person> stream = Person.getPersonsList().stream(); stream.forEach(v->System.out.print(v.getName()+"\t"));
2.通过 Stream 的静态方法 empty 创建空的流
Stream<Object> stream = Stream.empty();
3.通过 Arrays.stream(T [ ] o ) 创建流对象
Stream<Person> stream = Arrays.stream(new Person[]{ bill, cancel, smith});
4.通过 Stream.of(T… values) 创建流对象
Stream<Integer> stream = Stream.of(2, 4, 6, 8, 10);
5.通过 Stream.generate(Supplier s) 创建流,该方法返回一个无限顺序的序列流对象
Stream.generate(()->new Random().nextInt(20))
6.通过缓冲输出流也创建流对象
Stream<String> lines = new BufferedReader(new FileReader("\\文件名")).lines();
7.通过 Random 创建流(IntStream、DoubleStream 、LongStream )
IntStream intStream = new Random().ints(); DoubleStream doubles = new Random().doubles(