stream and lambda

stream and lambda,第1张

stream and lambda

这里写目录标题
  • java 8 Stream 流式编程
    • 一、stream 概要与使用场景
      • stream 概要
    • Lambda 表达式详解
    • stream
  • 额外学习

java 8 Stream 流式编程 一、stream 概要与使用场景 stream 概要
  • stream 流式编程是用于对集合迭代器的增强,使之能完成更高效的去和 *** 作(过滤、排序、统计分组)或者大批量数据 *** 作。此外 steam 与 lambada 表达式结合后编码效率大大提高,并且可读性更强。

  • stream 里面有多线程

  • 产生背景

    • 获取所有红色苹果的总重量,如果用sql其实非常好实现,为什么不直接在关系数据库中实现呢?

      select sum(a.wight) from apple as a where a.color='red' // 获取所有红色苹果重量
      select a.color,sum(a.weight) from apple as a group by color;
      
    • 传统的java ee项目数据源比较单一,可以这样做。但是现在的项目数据源多样化:关系数据库,Nosql,Redis,ElasticSearch等这是就需要我们从个数据源中汇总数据进行统计。这在stream出现前只能通过便利实现,非常繁琐

Lambda 表达式详解
  • Lambda 简介 :

    • 也称闭包,推动java 8 发布最重要的特性,Lambada 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。使用Lambada表达式可以使函数变得更加间接紧凑。
    • 这个实现其实在底层式一样的,lambda表达式在编译的时候会生成匿名内部类

    • 只能有一个方法 -> 函数式接口 -> @FunctionalInterface -> object下的方法除外

    • 函数式接口才能使用lambda,即才能把函数作为参数传递进去

    • 说明:new Thread 时需要传入一个匿名内部类,这个匿名内部类是runable接口,他是一个函数式接口,所以可以将他替换为lambda表达式进行传输,传输的参数其实就是run方法的参数,箭头后面就是run方法的实现。

    • 说明:Formatter是一个函数式接口,print方法有一个参数是这个函数式接口,所有在嗲用这个方法时传递的参数就可以将此函数式接口替换为lambda表达式,而lambda表达式是一个函数,所以这个函数其实就是实现的函数式接口里面的format方法。这其实就是一个匿名内部类,即new 出来一个Formatter但是没有名字,所以他的this是继承来的。

stream
  • 流的生成 :stream()

  • 流不可重复使用 :生成一个流stream1后,添加一个节点filter,这时stream1+filter形成了一个新的流stream2,原来的stream1作废,不能再stream1后再添加节点,只能在stream2后再添加节点。即stream流是不允许有分叉的。

  • 中间节点和中止节点:看stream类中方法,如果返回的是stream,则一般就是中间节点;否则是中止节点

    • 中间节点可以有很多个,用来构造pipeline,且是懒节点,只有调用中止节点时才会执行
    • 中止节点只能有一个,调用中止节点时会立刻执行。
  • 流的执行过程是一个数据一个数据的传递,而不是直接将整个数组list传递过去

  • filter :过滤节点,中间节点,传入箭头函数,参数a代表stream流中每次传进来的数据(其实就是i函数的参数),箭头就相当于将a传入方法体中,因为只有一条语句,可以省略方法体的{}和return。如果方法体中的判断条件返回true,则将此数据加入新生成的数组中。

  • map :映射节点,中间节点,也是传入箭头函数,将过滤下来的apple传进去后,返回颜色string类型,在接下来的节点中都是string类型的数据。

  • distinct():去重,将返回的所有的数据进行比较去重,只留下不一样的元素。

  • peek():中间节点,用来执行传入的函数

  • forEach():中止节点,与peek()作用一样,只不过这是个中止节点。单纯用来执行传入的箭头函数。

  • collect():采集,常用,中止节点。可以用于以下用途:

    1. list :collect(Collectors.toList())
    2. map:collect(Collectors.toMap(a->a.getColor(), a->a, (a1,a2)->a1)) // 第一个参数是key,第二个参数是value,如果有重复的key应该添加第三个参数进行merge,如果有两个apple a1,a2,则在里面选一个a1
    3. group by
    4. 数组
    5. 求出最大值
    6. 求任意值
  • stream debug

    • idea 自带工具 Trace Current Stream Chain
额外学习
Map maps new Hash<>();
//如果不存在这个key,则new 一个这个key,并返回其value对应的数据类型
List lsit = maps.computeIfAbsent(apple.getColor(),key->new ArrayList<>());
  • 要想真正搞懂一个框架,必须先去了解设计模式

  • coderead.cn 源码阅读网

  • mybatis 和 dubbo里面的动态代理都说明使用了同一种设计模式,为了实现透明化,屏蔽底层,从而简化我们的使用

  • lambda study link

  • stream study link

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4744748.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-08
下一篇 2022-11-08

发表评论

登录后才能评论

评论列表(0条)

保存