专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 如何学习java api:Stream API特性

如何学习java api:Stream API特性

更新时间:2020-01-16 15:09:23 来源:动力节点 浏览2147次


  随着Java8的越来越普及,Java8 中Stream API相关的面试越来越多,比如经常有面试官会问,是否有使用过Java8的经验?简单介绍一下流API等。下面小编简单的整理了Java8 Stream API的一些特性,对Stream API相关面试题做一个入口级别的回答。掌握这些内容,便于引导面试官继续向下深入发问。


如何学习java api:Stream API特性


  Stream 的定义:“根据支持数据处理操作的源生成的元素序列”。


  ●元素序列——就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序值。流的目的在于表达计算,比如filter、sorted和map。集合讲的是数据(存储),流讲的是计算(处理)。


  ●源——流会使用一个提供数据的源,如集合、数组等。


  ●数据处理操作——流的数据处理功能支持类似于数据库的操作,以及函数式编程语言中的常用操作,如filter、map、reduce、find、match、sort等。流操作可以顺序执行,也可并行执行。


  stream 操作的特点


  ●流水线——很多流操作本身会返回一个流,这样多个操作就可以链接起来,形成一个大的流水线。


  通过stream的这个操作特性,我们可以方便的使用链式编程(只要这个操作方法返回类型为stream即可),将多个操作联系起来.非常类似于数据库操作的sql语法(从哪张表查,查询条件是什么,查询哪些列的数据,排序规则如何等等),流水线的操作可以看作对数据源进行数据库式查询。


  ●内部迭代——与使用迭代器外部迭代的集合不同,流的迭代操作是在背后进行的。


  使用迭代器对集合数据进行迭代.这种方式有一定的缺陷:需要将如何迭代的代码与逻辑代码进行耦合.


  // 需求: 从学生名字列表中,筛选出姓李的学生,再筛选出名字是三个字的学生,最后将结果打印


  Listtemp = new ArrayList<>();

  for (String name : list) {

  if (name.startsWith("李")) {// 通过姓氏筛选

  temp.add(name);

  }

  }

  Listtemp1 = new ArrayList<>();

  for (String name : temp) {

  if (name.length() == 3) {// 通过名字长度筛选

  temp1.add(name);

  }

  }

  for (String string : temp1) {// 打印结果

  System.out.println(string);

  }


  对于上面的案例,我们使用传统的方式来做,看起来没有问题,但是,实现之后,回到本质上来,其实我们的需求仅仅是想做三件事而已,但是因为各种语法规范,我们不得不写出循环,再在循环中加入我们的逻辑.


  比如,如果我现在需求改变,不想通过这两个条件筛选,那么,我们现在的代码将会改动很大.这就是耦合.


  而,使用stream的方式,真正的舍弃”怎么做”,而回归到”做什么“上来.


  list.stream().

  filter(x -> x.startsWith("李")).// 筛选姓氏

  filter(x -> x.length() == 3).// 筛选名字长度

  forEach(System.out::println);// 打印


  显而易见的,使用stream的方式更优雅.而且,结果也是正确的.但是,上面的代码,有没有迭代呢?有,但是,这里的迭代,不再与逻辑耦合,这个,就叫内部迭代.


  stream 的特性


  尽管stream的获取方式,离不开数组或者集合,但是,stream对数据的计算,与传统方式完全不同.


  stream的特性,主要分为四个方面:


  1.无存储 。Stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,集合等。


  如何理解视图呢?


  比如,找出班上最高的五名同学,仅仅是计算全班的身高而已,而不会影响这五名同学.不会对整个班级有任何影响.


  2.不修改 。对Stream的任何修改都不会修改背后的数据源.


  比如过滤操作并不会删除被过滤的元素,而是产生一个新Stream。产生的心得Stream流,也仅仅是一个视图而已.


  3.惰式执行。Stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。


  如果操作是中间操作的话,那么,是不会立马就执行的, 一直等到用户要做终端操作的时候,才会执行.


  如果操作过程中,方法返回值类型是Stream的,那么他就是中间操作, 如果不是,就是终端操作.


  Listlist = Arrays.asList(1,2,3,4,5);

  list.stream().filter(x -> {

  //经过测试,如果没有调用终端操作,该语句不会输出在控制台.

  System.out.println("过滤操作");

  return x > 1;

  }).forEach(System.out::println);


  filter方法,返回类型为Stream,所以,该方法就是中间操作.


  foreach方法,返回类型不是Stream,所以,该方法就是终端操作.


  惰式执行的意思是:上面的代码,如果我们不调用foreach方法(终端操作),那么filter方法(中间操作)是一定不会执行的,而在控制台上一定不会输出”过滤操作”.


  4.可消费性。Stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。


如何学习java api:Stream API特性


      以上就是动力节点Java培训机构小编介绍的“如何学习java api:Stream API特性”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。


  相关文章


  JavaAPI的使用方法详解


提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>