聊聊 Stream API万字使用教程

作用:筛选出符合规则的元素,方法定义:,接收 断言函数式接口 Predicate,接收一个参数,返回boolean类型结果,案例:获取字符串数组中,字符串长度大于5的元素,运行结果:,聊聊 Stream API万字使用教程,map:对每一个元素进行指定操作后,返回新的元素,比如:数学运算,类型转换等操作,方法定义:,接收Function类型函数式接口,接收一个T类型参数,并返回一个R类型参数,案例:,运行结果:,聊聊 Stream API万字使用教程,flatMap:可以将流中的每一个值转换成另一个流,然后把所有的流连接起来再变成一个流,这个方法也可以叫压平,方法定义:,接收 Function 类型函数式接口,与map方法定义类似,但是可以接受一个流对象,案例:给定单词列表[“See”,“You”],你想要返回列表[“S”,“e”,“e”, “Y”,“o”,“u”],运行结果:,聊聊 Stream API万字使用教程,转换类型方法有:mapToInt、mapToLong、mapToDouble、flatMapToDouble、flatMapToInt、flatMapToLong,以上这些操作是map和flatMap的特例版,也就是针对特定的数据类型进行映射处理,返回的是指定的InteStream、LongStream、DoubleStream类型的流对象,包含一些数学运算,方法定义:,案例:计算数组的总字符长度,这里通过 mapToInt为例,其他的方法 同理,运行结果:,聊聊 Stream API万字使用教程,作用:unordered()操作不会执行任何操作来保障有序。它的作用是消除了流必须保持有序的约束,从而允许后续的操作,不必考虑排序,然后某些操作可以做一些特殊优化,注意:是“不保证有序”,不是“保证无序“,案例:,注意:,我们单单使用输出其实并不能看出什么端倪,在【JDK8】官方文档中有一句话对无序化做出了解释,作用:根据对象的hashCode()方法和equals()方法来确定是否是相同元素,进行去重,方法定义:方法没有参数,返回一个去重后的流对象,案例:,案例1运行结果:,聊聊 Stream API万字使用教程,案例2运行结果:,聊聊 Stream API万字使用教程,作用:对流进行排序,该方法有两个重载,一个无参,一个接收 Comparator比较器,传入比较器可以自定义排序,方法定义:,案例:对数组进行排序,运行结果:,聊聊 Stream API万字使用教程,作用:获取流中n个元素,并返回一个流对象,方法定义:接收一个long类型的数量,返回Stream,案例:获取四个字符串,运行结果:,聊聊 Stream API万字使用教程,作用:跳过n个元素,获取其后的所有元素,也可以理解为偏移量,方法定义:与limit类似,区别是功能不同,案例:跳过前两个字符串,运行结果:,聊聊 Stream API万字使用教程,作用:不调整元素顺序和数量的情况下消费每一个元素,然后产生新的流,按文档上的说明,主要是用于对流执行的中间过程做debug的时候使用,因为Stream使用的时候一般都是链式调用的,所以可能会执行多次流操作,如果想看每个元素在多次流操作中间的流转情况,就可以使用这个方法实现,方法定义:接收一个 消费型Consumer函数接口,返回Stream对象,案例:每次对流计算之后,看当前的计算结果,运行结果:,聊聊 Stream API万字使用教程,作用:跟普通的for循环类似,不过这个可以支持多线程遍历,但是不保证遍历的顺序,方法定义:接收一个 消费型Consumer函数接口,没有返回值,所以就不能继续往后操作了,直接终止流,案例:遍历数组,作用:将流转换为数组,方法定义:,案例:对数组去重,将去重后的数据放到新数组中,运行结果:,聊聊 Stream API万字使用教程,作用:有三个重载方法,作用是对流内元素做累进操作,方法定义:,案例1:分别使用一个参数和两个参数的方法进行累加计算,运行结果:,聊聊 Stream API万字使用教程,案例2:三个参数,1、单线程计算,结果:,聊聊 Stream API万字使用教程,2、多线程运算,使用 parallel() 方法转换为并行流,结果:,聊聊 Stream API万字使用教程,可以看出创建了11条线程参与运算,转换为并行流后第三个参数方法才会执行,组合器的作用,其实是对参数2中的各个线程,产生的结果进行了再一遍的归约操作!,作用:是一个终止操作,将流中的元素转换为各种类型的结果,方法定义:,案例1:演示方法1的使用,Employee类准备,收集器演示:,使用数组和对象集合:一共演示 11 个方法,结果太长,可通过代码自行打印,案例2:三个参数的收集器,与reduce类似,串行时并不执行参数3,并行时,参数3作为一个汇总,作用:获取流中最大值,方法定义:,根据提供的Comparator返回此流的最大元素,案例:获取数组中最大的数,作用:获取流中最小值,方法定义:,根据提供的Comparator返回此流的最小元素,案例:获取数组中最大的数,作用:获取流中元素个数,方法定义:方法返回一个long类型数据,案例:获取数组中元素个数,作用:Stream 中只要有一个元素符合传入的 predicate,返回 true;,方法定义:,案例:薪资大于8000,如果有符合条件的就直接返回true,不再向下执行,作用:Stream 中全部元素符合传入的 predicate,返回 true;,方法定义:,案例:薪资是否都大于3000,如果所有元素都符合条件就返回true,作用:Stream 中没有一个元素符合传入的 predicate,返回 true,方法定义:,案例:薪资是否有小于3000的,如果都没有则返回true,作用:用于返回满足条件的第一个元素(但是该元素是封装在Optional类中),方法定义:,案例:获取流中第一个员工,作用:返回流中的任意元素(但是该元素也是封装在Optional类中),方法定义:,案例:获取任意一个薪资大于6000的员工名字,通过多次执行,findAny每次返回的都是第一个元素,怀疑和findFirst一样,其实不然,findAny()操作,返回的元素是不确定的,对于同一个列表多次调用findAny()有可能会返回不同的值。使用findAny()是为了更高效的性能。如果是数据较少,串行地情况下,一般会返回第一个结果,如果是并行的情况,那就不能确保是第一个,比如并行:此时返回的值就不确定,但是少量数据时重复概率还是很大的,可能是因为Java编译器JIT做了优化,快速执行出一个结果,通过java.nio.file.Files对象的lines方法对文件进行流处理,运行结果:,文章出自:​​石添的编程哲学​​,如有转载本文请联系【石添的编程哲学】今日头条号。

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/17273.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34