IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> stream and lambda -> 正文阅读

[大数据]stream and lambda

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<String,List<Apple>> maps new Hash<>();
//如果不存在这个key,则new 一个这个key,并返回其value对应的数据类型
List<apple> lsit = maps.computeIfAbsent(apple.getColor(),key->new ArrayList<>());
  • 要想真正搞懂一个框架,必须先去了解设计模式

  • coderead.cn 源码阅读网

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

  • lambda study link

  • stream study link

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:36:07  更:2021-10-25 12:36:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:58:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码