JDK1.8新特性
jdk1.8新特性之函数型接口
jdk1.8新特性Lambda表达式推过程
jdk1.8新特性Stream流处理
导语
Stream流处理,不是IO流的处理,而是真正的函数式编程风格引入到Java中
概念
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
Stream API 实际应用
如何生产Stream
在 Java 8 中, 集合接口有两个方法来生成流:
-
stream() − 为集合创建串行流。
-
parallelStream() − 为集合创建并行流。
List为例
List<String> list = new ArrayList<>() ;
list.add("东邪");
list.add("西毒");
list.add("南帝");
list.add("北丐");
Stream API 使用
forEach
Stream 提供了新的方法 ‘forEach’ 来迭代流中的每个数据。
// 遍历集合
list.stream().forEach((x)->{
System.out.println(x);
});
filter
filter方法用于通过设置的条件过滤出元素。以下代码片段使用 filter 方法过滤出等于南帝的字符串
List collect1 = list.stream()
.filter(x -> "南帝".equalsIgnoreCase(x)).collect(Collectors.toList());
System.out.println(collect1);
limit
limit 方法用于获取指定数量的流。 以下代码片段使用 limit 方法打印出 3 条数据:
//输出
list.stream().limit(3).forEach(s -> System.out.println(s));
//转成list
List<String> collect2 = list.stream().limit(3).collect(Collectors.toList());
System.out.println(collect2);
skip
根据指定下标向后取值,包含指定下标
List limitNum2 = list.stream().skip(1).collect(Collectors.toList());
System.out.println(limitNum2);
sorted
sorted 方法用于对流进行排序,一般在skip/limit或者filter之后进行
list.stream().sorted().forEach(System.out::println);
min/max/distinct
distinct 去重,这里不做演示
String s = list.stream().min((x,y)-> x.hashCode() - y.hashCode()).get();
System.out.println(s);
String s2 = list.stream().max(Comparator.comparingInt(String::hashCode)).get();
System.out.println(s2);
扩展
这里摘自大漠老师的讲解
* 1. 聚合操作
*
* 2. stream的处理流程
* 数据源
* 数据转换
* 获取结果
* 3. 获取Stream对象
* 1. 从集合或者数组中获取[**]
* Collection.stream(),如accounts.stream()
* Collection.parallelStream()
* Arrays.stream(T t)
* 2. BufferReader
* BufferReader.lines()-> stream()
* 3. 静态工厂
* java.util.stream.IntStream.range()..
* java.nio.file.Files.walk()..
* 4. 自定构建
* java.util.Spliterator
* 5. 更多的方式..
* Random.ints()
* Pattern.splitAsStream()..
* 4. 中间操作API{intermediate}
* 操作结果是一个Stream,中间操作可以有一个或者多个连续的中间操作,需要注意的是,中间操作
* 只记录操作方式,不做具体执行,直到结束操作发生时,才做数据的最终执行。
* 中间操作:就是业务逻辑处理。
* 中间操作过程:无状态:数据处理时,不受前置中间操作的影响。
* map/filter/peek/parallel/sequential/unordered
* 有状态:数据处理时,受到前置中间操作的影响。
* distinct/sorted/limit/skip
* 5. 终结操作|结束操作{Terminal}
* 需要注意:一个Stream对象,只能有一个Terminal操作,这个操作一旦发生,就会真实处理数据,生成对应的处理结果。
* 终结操作:非短路操作:当前的Stream对象必须处理完集合中所有 数据,才能得到处理结果。
* forEach/forEachOrdered/toArray/reduce/collect/min/max/count/iterator
* 短路操作:当前的Stream对象在处理过程中,一旦满足某个条件,就可以得到结果。
* anyMatch/allMatch/noneMatch/findFirst/findAny等
* Short-circuiting,无限大的Stream-> 有限大的Stream。
关注 Java有货领取更多资料
联系小编。微信:372787553,带您进群互相学习
左侧小编微信,右侧获取免费资料
- Java 设计模式学习代码 https://github.com/Dylan-haiji/design-pattern
- SpringCloud学习代码: https://github.com/Dylan-haiji/javayh-cloud
- AlibabaCloud学习代码:https://github.com/Dylan-haiji/javayh-cloud-nacos
- SpringBoot+Mybatis 多数据源切换:https://github.com/Dylan-haiji/javayh-boot-data-soure
- Redis、Mongo、Rabbitmq、Kafka学习代码: https://github.com/Dylan-haiji/javayh-middleware
- SpringBoot+SpringSecurity实现自定义登录学习代码:https://github.com/Dylan-haiji/javayh-distribution