Stream的执行流程可分为:Stream的创建 -> 一些列的中间操作(过滤,映射等) -> 终止操作
1.Stream的创建方式

package com.yl.pdfdemo.day08.p8;import org.junit.Test;import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;/*** @Author wfj* @Date 2021/7/14* @Description Stream* @Version 1.0*/public class StreamAPITest {/*** Stream关注的是对数据的计算,主要和cpu打交道* 集合主要是存储数据,与内存打交道**  Stream的 执行流程*  1.Stream的实例化*  2.一些列的中间操作(过滤,映射等)*  3.终止操作**///创建Stream的方式一: 通过集合@Testpublic void test1() {//返回一个顺序流//default Stream<E> stream()List<String> list = Arrays.asList("a", "b", "c", "d");Stream<String> stream1 = list.stream();//返回一个并行流//default Stream<E> parallelStream()Stream<String> stream2 = list.parallelStream();}//创建Stream的方式二: 通过数组@Testpublic void test2() {int[] arr = new int[]{11,22,33};IntStream stream = Arrays.stream(arr);Person p1 = new Person(1001,"xioabai",18);Person p2 = new Person(1002,"xioahei",18);Person[] persons = new Person[]{p1,p2};Stream<Person> personStream = Arrays.stream(persons);}//创建Stream的方式三: 通过Stream的of()@Testpublic void test3() {Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);}//创建Stream的方式四: 创建无限流@Testpublic void test4() {//迭代//遍历前10个偶数Stream.iterate(0,t -> t + 2).limit(10).forEach(System.out::println);//生成Stream.generate(Math::random).limit(10).forEach(System.out::println);}
}

2.用到的实体类

package com.yl.pdfdemo.day08.p8;import java.util.Objects;/*** @Author wfj* @Date 2021/7/14* @Description* @Version 1.0*/public class Person {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Person() {}public Person(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return id == person.id &&age == person.age &&Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(id, name, age);}
}

3.Stream的中间操作

package com.yl.pdfdemo.day08.p8;import org.junit.Test;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Stream;/*** @Author wfj* @Date 2021/7/14* @Description Stream中间操作* @Version 1.0*/public class StreamAPITest1 {public List<Person> getPersonList() {Person p1 = new Person(1001,"xiaohei",17);Person p2 = new Person(1002,"xiaobai",18);Person p3 = new Person(1003,"xiaolon",20);Person p4 = new Person(1004,"dahei",22);Person p5 = new Person(1005,"dabai",17);Person p6 = new Person(1006,"lilan",23);Person p7 = new Person(1007,"lisiu",25);List<Person> list = new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);list.add(p4);list.add(p5);list.add(p6);list.add(p7);return list;}//1.筛选与切片@Testpublic void test1() {List<Person> list = getPersonList();//filter(Predicate) 从流中排除某些元素//筛选年龄大于20的list.stream().filter(p -> p.getAge() > 20).forEach(System.out::println);System.out.println();//limit(n)截断流,使其元素不超过给定数量list.stream().limit(3).forEach(System.out::println);System.out.println();//skip(n) -跳过元素,返回一个扔掉了前n个元素的流list.stream().skip(2).forEach(System.out::println);System.out.println();//distinct() -筛选,根据流中元素的hashcode()和equals()方法去重list.add(new Person(1008,"xxl",25));list.add(new Person(1008,"xxl",25));list.add(new Person(1008,"xxl",25));list.stream().distinct().forEach(System.out::println);}//映射@Testpublic void test2() {//map(Function f) 接收一个函数作为参数,将元素转换成其他形式或者提取信息List<String> list = Arrays.asList("aa", "bb", "cc", "dd", "ee");list.stream().map(s -> s.toUpperCase()).forEach(System.out::println);List<Person> personList = getPersonList();//获取年龄小于20的namepersonList.stream().filter(p -> p.getAge() < 20).map(Person::getName).forEach(System.out::println);//flatMap(Function f) 接收一个函数作为参数,将流中的每个值都换成另外一个流,然后把所有流连接成一个流list.stream().flatMap(StreamAPITest1::changeStringToStream).forEach(System.out::println);}public static Stream<Character> changeStringToStream(String str) {ArrayList<Character> lsit = new ArrayList<>();for (Character c : str.toCharArray()) {lsit.add(c);}return lsit.stream();}//排序@Testpublic void test3() {//sorted() -自然排序List<Integer> list = Arrays.asList(10, 8, 90, 100, 19);list.stream().sorted().forEach(System.out::println);//sorted(Comparator com) -定制排序List<Person> personList = getPersonList();personList.add(new Person(1001,"xxl",25));//先按照id从大到小排序,再按照年龄从小到大排序personList.stream().sorted((p1,p2) -> {int value = -Integer.compare(p1.getId(),p2.getId());if (value != 0) {return value;} else {return Integer.compare(p1.getAge(),p2.getAge());}}).forEach(System.out::println);}
}

4.Stream的终止操作

package com.yl.pdfdemo.day08.p8;import org.junit.Test;import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;/*** @Author wfj* @Date 2021/7/14* @Description Stream的终止操作* @Version 1.0*/public class StreamAPITest2 {public List<Person> getPersonList() {Person p1 = new Person(1001,"xiaohei",17);Person p2 = new Person(1002,"xiaobai",18);Person p3 = new Person(1003,"xiaolon",20);Person p4 = new Person(1004,"dahei",22);Person p5 = new Person(1005,"dabai",17);Person p6 = new Person(1006,"lilan",23);Person p7 = new Person(1007,"lisiu",25);List<Person> list = new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);list.add(p4);list.add(p5);list.add(p6);list.add(p7);return list;}//1.匹配与查找@Testpublic void test1() {List<Person> list = getPersonList();//allMatch(Predicate p) -检查是否匹配所有元素//判断集合中所有带飞元素年龄是否都大于20boolean b = list.stream().allMatch(p -> p.getAge() > 20);System.out.println(b); //false//anyMatch(Predicate p) -检查是否至少匹配一个元素//是否存在年龄小于18boolean b1 = list.stream().anyMatch(p -> p.getAge() < 18);System.out.println(b1); //true//noneMatch(Predicate p) -检查是否没有匹配的元素boolean b2 = list.stream().noneMatch(p -> p.getAge() > 50);System.out.println(b2); //true//findFirst -返回第一个元素Optional<Person> person = list.stream().findFirst();System.out.println(person);//Optional[Person{id=1001, name='xiaohei', age=17}]//findAny -返回流中任意一个元素Optional<Person> person1 = list.parallelStream().findAny();System.out.println(person1);//Optional[Person{id=1005, name='dabai', age=17}]//count -返回流中元素的总个数long count = list.stream().count();System.out.println(count);//7//max(Comparator com) -返回流中最大的值//获取最大的年龄Stream<Integer> stream = list.stream().map(p -> p.getAge());Optional<Integer> max = stream.max(Integer::compareTo);System.out.println(max.isPresent());// true 判断Optional内是否包含对象System.out.println(max); //Optional[25]System.out.println(max.get());//25//min(Comparator com) -返回流中最小的值//获取年龄最小的personOptional<Person> min = list.stream().min((p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));System.out.println(min);//Optional[Person{id=1001, name='xiaohei', age=17}]//forEach(Consumer c) - 内部迭代list.stream().forEach(System.out::println);}//归约@Testpublic void test2() {//reduce(T identity,BinaryOperator) -将流中元素反复结合起来,得到一个值,返回T//比如1-10的和List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);//第一个参数为初始值Integer sum = list.stream().reduce(0, Integer::sum);System.out.println(sum);//55//reduce(BinaryOperator) -将流中元素反复结合起来,得到一个值,返回Optional<T>List<Person> personList = getPersonList();//比如获取所有年龄的总和//方式一Optional<Integer> total = personList.stream().map(Person::getAge).reduce(Integer::sum);System.out.println(total); //Optional[142]//方式二Optional<Integer> total1 = personList.stream().map(Person::getAge).reduce((p1, p2) -> p1 + p2);System.out.println(total1);// Optional[142]}//收集@Testpublic void test3() {//collect(Collector c) -将流转换为其他形式List<Person> list = getPersonList();//获取年龄大于20的person的listList<Person> persons = list.stream().filter(p -> p.getAge() > 20).collect(Collectors.toList());System.out.println(persons.toString());//[Person{id=1004, name='dahei', age=22}, Person{id=1006, name='lilan', age=23}, Person{id=1007, name='lisiu', age=25}]persons.forEach(System.out::println);System.out.println();Set<Person> set = list.stream().filter(p -> p.getAge() > 20).collect(Collectors.toSet());set.forEach(System.out::println);}}

5.Optinal的使用
1)用到的实体类

package com.yl.pdfdemo.day08.p8;/*** @Author wfj* @Date 2021/7/14* @Description* @Version 1.0*/public class Boy {private Girl girl;public Boy() {}public Boy(Girl girl) {this.girl = girl;}public Girl getGirl() {return girl;}public void setGirl(Girl girl) {this.girl = girl;}@Overridepublic String toString() {return "Boy{" +"girl=" + girl +'}';}
}
package com.yl.pdfdemo.day08.p8;/*** @Author wfj* @Date 2021/7/14* @Description* @Version 1.0*/public class Girl {private String name;public Girl() {}public Girl(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Girl{" +"name='" + name + '\'' +'}';}
}

2)测试

package com.yl.pdfdemo.day08.p8;import org.junit.Test;import java.util.Optional;/*** @Author wfj* @Date 2021/7/14* @Description Optional类:为了在程序中避免空指针的出现* @Version 1.0*/public class OptionalTest {/*** 1.创建Optional类实例的方法*     Optional.of(T t) 创建一个Optional的实例,t不能为空*     Optional.empty() 创建一个空的Optional实例*     Optional.ofNullable(T t) t可以为null**  2.判断Optional容器内是否包含对象*      boolean isPresent() :判断是否包含对象*      void ifPresent(Consumer<? super T> consumer) :如果有值,就执行Consumer接口实现的代码,并且该值会作为参数传递给它**  3.获取Optional容器内的对象*      T get():如果调用对象包含值,则返回值,否则抛异常*      T orElse(T other) :如果有值则将其返回,否则,返回other*      T orElseGet(Supplier<? extends T> other) :如果有值将其返回,否则返回由Supplier接口实现提供的对象*      T orElseThrow(Supplier<? extends X> exceptionSupplier) :如果有值将其返回,否则抛出由Supplier接口实现提供的异常*/@Testpublic void test1() {Girl g1 = new Girl();Optional<Girl> opg1 = Optional.of(g1);System.out.println(opg1);//Optional[Girl{name='null'}]Optional<Object> empty = Optional.empty();System.out.println(empty); //Optional.emptyGirl g2 = new Girl();g2 = null;Optional<Girl> opg2 = Optional.ofNullable(g2);System.out.println(opg2);//Optional.empty//orElse(T t):如果当前Optional内部的t是非空的,返回t,否则返回orElse()方法中的tGirl girl = opg2.orElse(new Girl("xiaolan"));System.out.println(girl);}@Testpublic void test2() {Boy boy = new Boy();//会报空,因为没有Girl//  String girlName = getGirlName(boy);String girlName1 = getGirlName1(boy);System.out.println(girlName1);//小兰}public String getGirlName(Boy boy) {return boy.getGirl().getName();}//使用Optional类改造public String getGirlName1(Boy boy) {Optional<Boy> optionalBoy = Optional.ofNullable(boy);Boy boy1 = optionalBoy.orElse(new Boy(new Girl("小芳")));Girl girl = boy1.getGirl();Optional<Girl> girlOptional = Optional.ofNullable(girl);Girl girl1 = girlOptional.orElse(new Girl("小兰"));return girl1.getName();}}

java Stream详解相关推荐

  1. Java基础——Java NIO详解(一)

    一.基本概念 1.I/0简介 I/O即输入输出,是计算机与外界世界的一个借口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通过str ...

  2. Apache Thrift - java开发详解

    2019独角兽企业重金招聘Python工程师标准>>> Apache Thrift - java开发详解 博客分类: java 架构 中间件 1.添加依赖 jar <depen ...

  3. Java泛型详解-史上讲解最详细的,没有之一

    目录 1. 概述 2. 一个栗子 3. 特性 4. 泛型的使用 4.1 泛型类 4.2 泛型接口 4.3 泛型通配符 4.4 泛型方法 4.4.1 泛型方法的基本用法 4.4.2 类中的泛型方法 4. ...

  4. Java虚拟机详解----JVM常见问题总结

    [正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考本人之前的系列文章,尤其是那篇:Java虚拟机详解04----GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾 ...

  5. java 泛型详解、Java中的泛型方法、 java泛型详解

    本文参考java 泛型详解.Java中的泛型方法. java泛型详解 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即& ...

  6. 最详细的java泛型详解

    来源:最详细的java泛型详解 对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. ja ...

  7. Java异常详解及如何处理

    来源:Java异常详解及如何处理 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误给用户?或者用C语言 ...

  8. Java基础——Java NIO详解(二)

    一.简介 在我的上一篇文章Java NIO详解(一)中介绍了关于标准输入输出NIO相关知识, 本篇将重点介绍基于网络编程NIO(异步IO). 二.异步IO 异步 I/O 是一种没有阻塞地读写数据的方法 ...

  9. Java基础——Java IO详解

    一.概述 1.Java IO Java IO即Java 输入输出系统.不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要 ...

最新文章

  1. 隐藏式抽屉SlidingDrawer(无法实现垂直)
  2. 【QGIS入门实战精品教程】1.1:QGIS与GIS的区别和联系
  3. Shell 参数传递、 $* 与 $@ 区别
  4. laravel运用redis存储数据和读取的方式
  5. 信息学奥赛一本通(1141:删除单词后缀)
  6. LabWindows/CVI第一章:基本规则
  7. 洛谷 P1129 BZOJ 1059 cogs 660 [ZJOI2007]矩阵游戏
  8. 电池测试系统连接服务器失败,服务器报电池故障
  9. android开发简历,轻松拿到了阿里Android高级开发工程师的offer
  10. Winxp U盘无法复制磁盘写保护解决办法。
  11. C++20 latch
  12. CSDN问答标签技能树(一) —— 基本框架的构建
  13. 【学习记录】图片行列切割与子图行列拼接之中央裁剪法
  14. PLC实验—西门子S7 1200读取旋转编码器数据并计算电机转速
  15. 文明重启战局服务器维护中,王牌战争文明重启8月23日更新公告
  16. python中将字符变为大写_Python实现将字符串的首字母变为大写,其余都变为小写的方法...
  17. JavaScript+屏幕自适应:时钟(色卡分享+canvas+js)
  18. 南京大学软件工程842参考书攻略
  19. C语言学习笔记——输入五个国家的名称,按字母顺序排列输出
  20. Bias(偏差),Variance(方差),Error(误差)

热门文章

  1. 广域网技术——FlexE
  2. VR虚拟现实|vr全景制作|vr全景拍摄|vr全景加盟|vr全景智慧城市
  3. Spring事务剖析-TransactionManager
  4. java中使用事务案例_Java事务处理全解析(四)—— 成功的案例(自己实现一个线程安全的TransactionManager)...
  5. C#-概念-基础类库:基础类库
  6. 微信是否被好友删除,不用发消息也知道,怎么做到的呢?
  7. 51单片机STC89C52点亮一个LED(IO口的位操作)
  8. dropout的用法
  9. 计算机彻底删除的文件如何恢复出厂设置,普通电脑怎么恢复出厂设置
  10. 在ubuntu16.04上搭建samba文件共享服务器