Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询。也可以使用Stream API来并行执行操作。简言之,Stream API提供了一种高效且易于使用的处理数据的方式
Collection集合和Stream的区别
Collection是一种静态的内存数据结构,而Stream是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向CPU,通过CPU实现计算。
Stream是什么
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列
“集合讲的是数据,Stream讲的是计算”
注意
- Stream自己不会存储元素
- Stream不会改变源对象。会返回一个持有结果的新Stream
- Stream操作是延迟执行的,意味着会等到需要结果时候才会执行
1-创建Stream
一个数据源(如:集合、数组),获取一个流
- 创建Stream方式一:通过集合
- default Stream
- default Stream
- 创建Stream方式二:通过数组
- static
- 重载形式,能够处理对应基本类型的数组:
- public static IntStream stream(int[] array)
- public static LongStream stream(long[] array)
- public static DoubleStream stream(double[] array)
- 创建Stream方式三:通过Stream的of()
- 可以调用Stream类静态方法of(),通过显示值创建一个流。它可以接收任意数量的参数
- public static
- 创建Stream方式四[了解]:创建无限流
- 可以使用静态方法 Stream.iterate()和Stream.generate(),创建无限流
- 迭代: public static
- 生成: public static
2-中间操作
一个中间操作链,对数据源的数据进行处理(过滤、映射。。。)
多个中间操作可以连接来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理。而在终止操作时一次性全部处理,称为“惰性求值”
1. 筛选与切片
- filter(Predicate p):接受Lambda,从流中排除某些元素
- distinct():筛选,通过流所生成元素的hashCode()和equals()去除重复元素
- limit(long maxSize):截断流,使其元素不超过给定数量
- skip(long n):跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补
2. 映射
- map(Function f):接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
- mapToDouble(ToDoubleFunction f):接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的DoubleStream
- mapToInt(ToIntFunction f):接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的IntStream
- mapToLong(ToLongFunction f):接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的LongStream
- flatMap(Function f):接受一个函数作为参数,将流中每个值都换成另一个流,然后把所以流连接成一个流
3.排序
- sorted():产生一个新流,其中按自然顺序排序
- sorted(Comparator com):产生一个新流,其中按比较器顺序排序
3-终止操作(终端操作)
一旦执行终止操作,就执行中间操作链,并产生结果。之后,会在被使用。
- 匹配与查找:
- allMatch(Predicate p):检查是否匹配所有元素
- anyMatch(Predicate p):检查是否至少匹配一个元素
- noneMatch(Predicate p):检查是否没有匹配所有元素
- findFirst():返回第一个元素
- findAny():返回当前流中的任意元素
- count():返回流中元素总数
- max(Comparator c):返回流中最大值
- min(Comparator c):返回流中最小值
- forEach(Consumer c): 内部迭代(使用Collection接口需要用户去做迭代,称为外部迭代。相反Stream ApI使用内部迭代——它帮你迭代)
- 归约:
- reduce(T iden, BinaryOperator b): 可以将流中元素反复结合起来,得到一个值。返回T
- reduce(BinaryOperator b): 可以将流中元素反复结合起来,得到一个值,返回Optional
- 备注:map和reduce连接常被称为map-reduce模式,因Google用它来进行网络搜索而出名
- 收集:
- collect(Collector c):将流转换为其他形式,接受一个Collector接口的实现,用于给Stream中元素做汇总的方法
- Collector接口中方法的实现决定了如何对流执行收集的操作(如收集到List、Set、Map)
- 另外,Collectors实用类提供了很多静态方法,可以方便地创建地创建收集器实例
本文章使用limfx的vscode插件快速发布