当前位置:网站首页>lambda表达式、Stream接口及Optional类
lambda表达式、Stream接口及Optional类
2022-08-02 14:21:00 【靳靳有味小丸子】
一、什么是lambda表达式
lambda表达式是一种行为参数化,即把一个方法当成一个参数传入到另一个方法当中。
lambda表达式的目标类型必须是一个函数接口,有且只有一个抽象方法,但是可以有多个非抽象方法的接口。
JDK中,定义了@FunctionalInterface注解,用于定义函数接口
二、lambda表达式的语法
标准语法:(参数列表)-> {代码块}
三、lambda表达式之方法引用
方法引用是lambda表达式的简化缩写,但不针对所有的lambda表达式。
方法引用只针对一条语句,不能打{}。
方法引用的参数列表要和抽象方法的参数一致。
四、lambda表达式之方法引用语法分类
1.引用普通对象的普通方法
语法-----对象名::实例方法名
2.引用类的静态方法
语法------类名::方法名
3.引用类的构造方法
语法------类名::new
五、Stream接口
Stream接口是java.util.stream类中的接口,提供一种声明式的方式来处理数据。
Stream的作用是操作而不是存储或管理数据,数据还是存放在数据源的。
得到Stream对象后,下面每一个操作都是返回一个新的Stream对象,直到最后一个操作。中间操作都是返回Stream对象,最后操作是返回一个非Stream对象或者没有返回。
Stream采用"惰性求值"和"及早求值"两种方式执行操作。Stream中的所有中间操作都不是严格意义的立即执行,而是全部会到最后一个操作中融合起来,这样可以一次遍历就完成,而不是每个操作做一次遍历。所以中间岗位都是"惰性"的,只有最后岗位才是"及早求值"--立即执行的。
Stream操作都可采用Lambda表达式书写方式。
六、数据源得到Stream的方式
1.通过数组得到stream对象
2.根据集合(List,Set,Map)得到stream对象
3.根据stream的of方法
七、Stream实现迭代
迭代分为外部迭代和内部迭代。
外部迭代是程序员自己去完成迭代的循环控制。
内部迭代是在API的forEach()方法内完成。
forEach方法接收的是一个叫Consumer的函数接口,该接口接收一个参数(这个参数就是集合中的每个元素),我们只需要告诉传入代码块表明如何操作这个参数即可。
八、Stream常用的中间操作
Stream的中间操作,都是惰性的。这些方法的返回值仍然是Stream类型的新对象,只能充当中间操作。
1.map()---是对每个元素的操作。
2.filter()---是书写过滤条件,满足条件的元素被保留,不满足的被排除。
3.distinct()---用于去除重复的元素,根据在Stream中的元素中的hashCode和equals方法,判断元素是否重复。
4.sorted()---用于对元素排序,该功能由两个重载功能组成,一个无参,按元素自带的内部比较器(元素类型实现Comparable接口)方式排序;另一个可以指定一个外部比较器(Comparator接口)方式排序。
5.limit()--方法用于限制流中元素的个数。返回第一个元素开始的n个元素。
九、Stream常用的最后操作
以下方法只能作为stream最后操作,方法执行后返回的不是Stream对象,或者没有返回值。
1.forEach()---遍历循环取出Stream中的元素。该方法无返回值。
2.count()---得到Stream流中元素的个数该方法返回 long。
3.max()、min()---得到Stream流中元素的最大值和最小值。该方法返回 Optional对象,通过Optional对象的get方法,得到最大或最小的元素。
4.Collect()---利用Collectors类实现了很多归约操作,可以将Stream中的元素转换成集合和聚合元素。
十、 Optional类
Optional处理空指针异常,是一个java.util包的类,它是一个容器,可以包含空值或非空值。
Optional包含两个属性:一个静态属性EMPTY,用来存放一个值为null的Optional对象;另一个是非空静态属性value,用来存放非null对象。
创建Optional对象的方式有三种:
1、生成一个空的Optional对象,其value属性值为null
2、传入不为null值的Optional对象,其value属性值不能为null
在该方法中如果传入null值,将导致空指针异常
3、传入允许为null值的Optional对象
十一、 Optional类常用方法
1.get()---返回value值,如果value为null,抛出NoSuchElementException
isPresent()---value不为null,返回true;否则返回false
2.ifPresent()---如果Optional实例有值,则为其调用consumer函数接口,否则不做处理。该方法无返回值。
3.map()---如果值存在,对该值执行参数Function函数接口提供的代码块。返回Optional对象。
orElse()---如果有值则将其返回,否则返回一个默认值。
4.orElseThrow()---如果有值则将其返回,否则抛出一个由参数Supplier接口函数执行后指定生成的异常。
5.filter()---如果值存在,并且满足Predicate函数接口提供的条件,返回包括该值的Optional对象,否则返回空的Optional对象
总结
1、Lambda 本质是一个匿名内部类,可以写出更简洁、更灵活的代码。
2、Lambda表达式是一种行为参数化,即把一个方法当作参数传入到另一个方法当中。Lambda表达式的目标类型必须是一个函数接口。
3、Lambda表达式中,如果需要操作该表达式所在方法的局部变量,那么只能将其做为final常量进行操作。
4、Lambda表达式之方法引用中,只能针对于单独一句代码,且该代码是调用方法的Lambda表达式。方法引用的方法参数列表原型必须和接口抽象方法参数原型一致。
5、Stream是java.util.stream包中定义的接口,其作用是提供一种声明式的方式来处理数据。Stream的用于操作,数据还是存放在数据源的。
6、Stream对象的每一个操作都是返回一个新的Stream对象,直到最后一个操作。中间操作都是返回Stream对象,最后操作是返回一个非Stream对象或者没有返回。
7、Optional是一个java.util包的类,它是一个容器,可以包含空值或非空值。Optional 类主要解决的问题是空指针异常。
边栏推荐
猜你喜欢
随机推荐
2021年华为杯数学建模竞赛E题——信号干扰下的超宽带(UWB)精确定位问题
【故障诊断】基于PSO_VMD_MCKD方法的风机轴承微弱故障诊断
【面经】被虐了之后,我翻烂了equals源码,总结如下
只出现一次的数字||| —— 哈希映射、异或位运算+分治思想
makefile——杂项
Mysql索引底层数据结构
WeTest----如何查看Wetest生成测试报告?
对象头和synchronized的升级
The difference and connection between dist, pdist and pdist2 in MATLAB
【无标题】
Redis6
js电梯导航基础案例
DOM —— 事件机制及事件链
DOM - page rendering process
加载事件的用法
【Anaconda】一行语句解决Spyder启动问题
static关键字的三种重要作用详解
集成电路实践----D触发器
网络运维系列:Ubnt ER-X初始化和开启硬件NAT
搭建Spark开发环境