Java8 Steam API
简介
Stream API ( java.util.stream)
把真正的函数式编程风格引入到Java
中。这 是目前为止对Java
类库最好的补充,因为Stream API
可以极大提供Java程 序员的生产力,让程序员写出高效率、干净、简洁的代码。
使用场景
- 实际开发中,项目中多数数据源都来自于
Mysql
,Oracle
等。但现在数 据源可以更多了,有MongDB
,Radis
等,而这些NoSQL的数据就需要 Java
层面去处理
Stream
和 Collection
集合的区别:Collection
是一种静态的内存数据 结构,而 Stream
是有关计算的。前者是主要面向内存,存储在内存中, 后者主要是面向 CPU,通过 CPU 实现计算。
Stream 操作的三个步骤
创建Stream,获取一个工作流
中间操作,对数据进行中间处理
终止操作
创建Stream
集合
1 2
| default Stream<E> stream()
|
1 2
| default Stream<E> parallelStream()
|
数组
1 2
| static <T> Stream<T> stream(T[] array)
|
stream of
1 2
| public static<T> Stream<T> of(T... values)
|
无限流
迭代
1
| public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
|
生成
1
| public static<T> Stream<T> generate(Supplier<T> s)
|
实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Test public void test4() { Stream<Integer> stream = Stream.iterate(0, x -> x + 2); stream.limit(10).forEach(System.out::println);
Stream<Double> stream1 = Stream.generate(Math::random); stream1.limit(10).forEach(System.out::println); }
|
中间操作
筛选与切片
方法 |
描述 |
filter(Predicate p) |
接受Lambda,从流中排除某些元素 |
distinct() |
筛选,通过流所生成元素的hashCode()和equals() 去除重复元素 |
limit(long maxSize) |
截断流,使其元素不超过给定数量 |
skip(long n) |
跳过元素,返回一个扔掉了前n个元素的流,不足n放回空流 |
映射
方法 |
描述 |
map(Function f) |
接收一个函数作为参数,该函数会被应用到每个元素上, 并将其映射成一个新的元素。 |
mapToDouble(ToDoubleFunction f) |
接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream |
mapToInt(ToIntFunction f) |
接收一个函数作为参数,该函数会被应用到灭个元素上,产生一个新的IntStream |
mapToLong(ToLongFunction f) |
接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongStream |
flatMap(Function f) |
接收一个函数作为参数,将流中毒的每个值都换成一个流,然后把所有的流连接成一个流 |
排序
方法 |
描述 |
sorted() |
产生一个新流,其中按自然顺序排序 |
sorted(Comparator com) |
产生一个新流,其中按比较器顺序排序 |
Stream终止操作
匹配与查找
方法 |
描述 |
allMatch(Predicate p) |
检查是否匹配所有元素 |
anyMatch(Predicate p) |
检查是否至少匹配一个元素 |
noneMatch(Predicate p) |
检查是否没有匹配所有元素 |
findFirst() |
返回第一个元素 |
findAny() |
返回任一元素 |
count() |
返回流中元素总数 |
max(Comparator c) |
返回流中最大值 |
min(Comparator c) |
返回流中的最小值 |
forEach(Consumer c) |
内部迭代(使用Conllection接口需要用户去做迭代,称为外部迭代。相反,Stream API使用内部迭代) |
归约
方法 |
描述 |
reduce(T iden,BinaryOperator b) |
可以将流中元素反复结合起来,的带一个值,返回T |
reduce(BinaryOperator b) |
可以将流中元素反复结合起来,的带一个值。返回Opeional |
备注:map 和 reduce 的连接通常称为 map-reduce 模式,因 Google 用它来进行网络搜索而出名。
收集
方法 |
描述 |
collect(Collector c) |
将流转换为其他形式,接收一个Collector接口的实现, 用于给Stream中元素做汇总方法 |