美文网首页技术栈
2019-02-02——Java8 Stream

2019-02-02——Java8 Stream

作者: 烟雨乱平生 | 来源:发表于2019-02-10 00:15 被阅读0次

Stream分为两种:

  1. 串行流——stream()
  2. 并行流——parallelStream()

Stream的特性

  • 不存储数据
  • 不改变源数据
  • 延迟执行
  • 只能遍历一次

Stream的产生方式

  1. 用过集合获取
List<String> list = new ArrayList();
list.stream(); 
  1. 通过数组获取
String[] array = new String[]{"a"};
Arrays.stream(array);
  1. 通过Stream类
Stream<Integer> integerStream = Stream.of(1, 2, 3);
  1. 创建无限流
Stream.generate(UUID::randomUUID).limit(10);
Stream.iterate(1,i->i+i).limit(10);
  • generator方法,返回一个无限长度的Stream,其元素由Supplier接口的提供
  • iterate方法,其返回的也是一个无限长度的Stream,与generate方法不同的是,其是通过函数f迭代对给指定的元素种子而产生无限连续有序Stream,其中包含的元素可以认为是:seed,f(seed),f(f(seed))无限循环。
  1. 创建空的流
Stream.empty();
  1. 其他方式创建
Files.lines(Paths.get(""));

Stream的使用

流的使用可以分为三步:

  1. 获取数据源
  2. 执行数据转换
  3. 执行操作获取结果

可以使用另一种说法:

  1. 创建Stream
  2. 执行中间操作
  3. 执行终端操作

一个流后面可以跟零个或者多个中间操作,中间操作都是惰性化的;一个流后面只能有一个终端操作,当执行这个操作后,流就被用“光”了,无法再被操作,终端操作的执行才是整个流开始遍历。

Stream的操作

流的操作可以分为三种:

  1. Intermediate操作
  2. Terminal操作
  3. Short-circuiting操作

Intermediate操作

方法 入参类型 返回值 说明
concat Stream,Stream Stream concat方法将两个Stream连接在一起,合成一个Stream。若两个输入的Stream都时排序的,则新Stream也是排序的;若输入的Stream中任何一个是并行的,则新的Stream也是并行的;若关闭新的Stream时,原两个输入的Stream都将执行关闭处理。
distinct void Stream distinct方法以达到去除掉原Stream中重复的元素,生成的新Stream中没有没有重复的元素。
filter Predicate Stream filter方法对原Stream按照指定条件过滤,在新建的Stream中,只包含满足条件的元素,将不满足条件的元素过滤掉。
flatMap Function Stream flatMap方法与map方法类似,都是将原Stream中的每一个元素通过转换函数转换,不同的是,该换转函数的对象是一个Stream,也不会再创建一个新的Stream,而是将原Stream的元素取代为转换的Stream。如果转换函数生产的Stream为null,应由空Stream取代。flatMap有三个对于原始类型的变种方法,分别是:flatMapToInt,flatMapToLong和flatMapToDouble
limit long Stream limit方法将截取原Stream,截取后Stream的最大长度不能超过指定值N。如果原Stream的元素个数大于N,将截取原Stream的前N个元素;如果原Stream的元素个数小于或等于N,将截取原Stream中的所有元素。
map Function Stream map方法将对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。为了提高处理效率,官方已封装好了,三种变形:mapToDouble,mapToInt,mapToLong。其实很好理解,如果想将原Stream中的数据类型,转换为double,int或者是long是可以调用相对应的方法。
peek Consumer Stream peek方法生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer实例),新Stream每个元素被消费的时候都会执行给定的消费函数,并且消费函数优先执行
skip long Stream skip方法将过滤掉原Stream中的前N个元素,返回剩下的元素所组成的新Stream。如果原Stream的元素个数大于N,将返回原Stream的后(原Stream长度-N)个元素所组成的新Stream;如果原Stream的元素个数小于或等于N,将返回一个空Stream。
sorted Comparator Stream sorted方法将对原Stream进行排序,返回一个有序列的新Stream。sorterd有两种变体sorted(),sorted(Comparator),前者将默认使用Object.equals(Object)进行排序,而后者接受一个自定义排序规则函数(Comparator),可按照意愿排序。

Terminal操作

方法 入参类型 返回值 说明
allMatch Predicate boolean allMatch操作用于判断Stream中的元素是否全部满足指定条件。如果全部满足条件返回true,否则返回false
anyMatch Predicate boolean anyMatch操作用于判断Stream中的是否有满足指定条件的元素。如果最少有一个满足条件返回true,否则返回false
noneMatch Predicate booean noneMatch方法将判断Stream中的所有元素是否满足指定的条件,如果所有元素都不满足条件,返回true;否则,返回false.
count void long count方法将返回Stream中元素的个数。
findAny void Optional findAny操作用于获取含有Stream中的某个元素的Optional,如果Stream为空,则返回一个空的Optional。由于此操作的行动是不确定的,其会自由的选择Stream中的任何元素。在并行操作中,在同一个Stram中多次调用,可能会不同的结果。在串行调用时,Debug了几次,发现每次都是获取的第一个元素,个人感觉在串行调用时,应该默认的是获取第一个元素。
findFirst void Optional findFirst操作用于获取含有Stream中的第一个元素的Optional,如果Stream为空,则返回一个空的Optional。若Stream并未排序,可能返回含有Stream中任意元素的Optional。
forEach Consumer void forEach方法接收一个Lambda表达式,然后在Stream的每一个元素上执行该表达式。
forEachOrdered Consumer void forEachOrdered方法与forEach类似,都是遍历Stream中的所有元素,不同的是,如果该Stream预先设定了顺序,会按照预先设定的顺序执行(Stream是无序的),默认为元素插入的顺序。
max Comparator Optional max方法根据指定的Comparator,返回一个Optional,该Optional中的value值就是Stream中最大的元素
min Comparator Optional min方法根据指定的Comparator,返回一个Optional,该Optional中的value值就是Stream中最小的元素。

相关文章

  • Java8之Stream流(六)收集

    Java8之Stream流(一)基础体验 Java8之Stream流(二)关键知识点 Java8之Stream...

  • Java 8 Stream--开发手册

    什么是Java8 Stream,为什么需要Stream? Stream是Java8一大亮点,它与 java.io ...

  • Java8 学习笔记

    @(in action系列)[java8, lambda, stream] Java8 学习 java8 能高效的...

  • Stream流

    Stream流 java8新特性 Stream定义 A sequence of elements supporti...

  • java8 stream lambda

    记录Java8的stream操作,供自己复习。 创建Stream Employee类 创建stream方法 for...

  • JAVA8中Stream学习

    JAVA8中Stream学习 最近看了下Stream的api: Stream用户操作Collection族的数据,...

  • Java8 Stream 流的重用

    Java8 Stream 已经被操作或关闭 引言 在 java8 中,Stream 不能被重用,一旦它被使用或使用...

  • 2019-02-02——Java8 Stream

    Stream分为两种: 串行流——stream() 并行流——parallelStream() Stream的特性...

  • Java8 Stream 使用及其详解

    一、什么是Stream 二、Java7和Java8 聚合操作的区别。 三、Stream 总览 四、Stream 的...

  • Java 8 Stream 教程

    本文采用实例驱动的方式,对JAVA8的stream API进行一个深入的介绍。虽然JAVA8中的stream AP...

网友评论

    本文标题:2019-02-02——Java8 Stream

    本文链接:https://www.haomeiwen.com/subject/mqossqtx.html