当前位置: 首页 > article >正文

一篇搞定Lambda和Stream流

一、Lambda表达式

jdk8中的语法糖,优化某些匿名内部类的写法,函数式编程的重要体现,不再关注对象是什么,更关注数据进行了什么操作

1、练习

练习1

练习2 

 

 

练习3

 

 练习4

 练习5

2、省略规则

  • 参数类型可以省略
  • 方法体只有一句代码时大括号return和那句代码的分号可以省略
  • 方法还有一个参数时小括号可以省略
  • 不知道怎么省略就直接Alt+回车

二、Stream流

使用的是函数式编程模式,如同名字一样,可以被用来对集合或数组进行链状流式的操作,更方便我们对集合或数组操作

1、入门案例

把集合中年龄小于18的作家名字打印,注意去掉重复的

注意:所有中间方法的调用离不开终结方法,如果没有调用终结方法,中间都不会执行

2、创建操作

单列集合:直接.stream()就行

数组:Stream<Integer> stream = Arrays.stream(arr);还有一种方式就是使用Stream类的of方法传入一个数组也是得到一个流对象

双列集合:用map调用entrySet方法转化为set集合,set集合存放的就是entry,一个entry包含key和value。转化为单列集合后再调用单列集合的方法。

3、中间操作

filter

对流中国的元素进行条件过滤,符合过滤条件的才能进行留在流中

例如:打印所有名字长度大于1的作家的姓名 

map

可以把流当中元素进行计算或者转化

例如:打印所有作家的名字

获得到所有作家的年龄然后加10打印

distinct

可以去除流中重复元素

例如:打印所有作家的名字,并且要求其中不能有重复元素

注意:distinct方法是依赖Object的equals方法来判断是否是相同对象的,所以需要注意重写equals方法

sorted

可以对流中的元素进行排序

例如:对流中国元素按照年龄进行降序排序,并且要求不能有重复的元素。

如果调用空参数的sorted方法,需要流中的元素是实现comparable接口的

用带参数的也可以,直接传入匿名内部类的形式

limit

可以设置流的最大长度,超出的部分将背抛弃

skip

跳过流中前n个元素,返回剩下的元素

例如:打印除了年龄最大的作家外的其他作家,要求不能有重复元素,并且按照年龄降序排序

flatMap

map只能把一个对象转化成另一个对象来作为流中的元素,而flatMap可以把一个对象转化成多个对象作为流中的元素

例一:一个作者写了很多书,打印所有书籍的名字,要求对重复元素进行去重

flatMap会帮我们把一个对象转化为多个对象放到流中

例一:打印现有数据所有分类,要求分类进行去重,不能出现这种格式:哲学,爱情

第二个flatMap方法中的split分割完是数组,数组转化为stream就得用Arrays的api

4、终结操作

forEach

对流中的元素进行遍历操作,通过传入参数指定对遍历的元素进行什么操作

count

可以用来获取流中元素的个数

例子:打印作家的所有书籍的数目,注意删除重复元素

max&min

可以用来获取流中的最值

例子:分别获取作家书籍中最高分和最低分并打印

collect

把当前流转换成一个集合

anyMatch

是否有满嘴条件的,如果有就返回true,所有元素都不符合返回false

allMatch

判断是否所有的都匹配,如果是返回true,不是返回false

noneMatch

都不符合返回true,有符合的就返回false

findAny

获取流中任意一个符合条件的元素,改方法不能保证获取的一定是流中的第一个元素

optional是jdk为了防止接收的空指针所有规定要用这个返回

findFirst

获取流中第一个符合条件的元素

reduce

对流中的数据按照你指定的计算方式计算出一个结果(缩减操作)

reduce的作用就是把流中的元素组合起来,我们可以传入初始值,他会按照我们计算方式依次拿六中元素和初始值的基础上进行计算,计算结果再和后面的元素计算

5、注意事项

惰性求值(如果没终结操作,没中间操作是不会得到执行的)

流是一次性的(一旦一个流对象经过一个终结操作后,这个流就不能再被使用了)

不会影响原数据(流中可以多数据做处理,正常下不会影响原来集合中的数据)


http://www.kler.cn/news/9993.html

相关文章:

  • 最新CAMx-Python融合技术应用与大气污染来源解析方法应用
  • MongoDB 介绍和基本操作
  • 【设计模式】常用的几种设计模式——单例模式
  • RuoYi-Vue Pro框架学习启动教程
  • 【数据结构】排序习题
  • Vue学习-Vue入门
  • 【MySQL学习】认识MySQL数据库
  • ObjectBox一种基于中心点的无锚点目标检测方法
  • 「UG/NX」Block UI 快速定位ORentXpress
  • 4.10日报
  • 10个镜像网站工具箱供你使用,不注册ChatGPT也能免费使用ChatGPT
  • 2023美团春招4.8 后端真题和解析 第三题:水果打包
  • Servlet入门讲解
  • Python 小型项目大全 26~30
  • 一位27岁软件测试员,测试在职近5年,月薪不到2W,担心被应届生取代
  • keep-alive 和 router-view 的使用方法(Vue3)
  • 怎样才能进有数据、有技术的公司?
  • 3.1 微分中值定理
  • leetcode 139.单词拆分
  • 无重复全排列 [2*+]
  • tpm2-tools源码分析之tpm2_load.c(6)
  • 【二分汇总】
  • 全国青少年信息素养大赛2023年python·选做题模拟二卷
  • 「计算机控制系统」2. 采样与数据保持
  • houjie-cpp面向对象
  • 刷题day54:柱形图中最大矩形
  • Java多线程基础面试总结(一)
  • 【数据挖掘与商务智能决策】第十一章 AdaBoost与GBDT模型
  • 数字孪生智慧应急怎么实现?
  • 运行时内存数据区之虚拟机栈——操作数栈