jdk1.8新特性Stream流处理

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,带您进群互相学习
左侧小编微信,右侧获取免费资料
在这里插入图片描述

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杨同学~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值