lambda表达式、Stream接口及Optional类

一、什么是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 类主要解决的问题是空指针异常。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Lambda表达式在处理集合元素时,有可能会遇到空指针异常(NullPointerException)的问题。当对一个集合进行stream操作时,如果集合中的元素存在空值,那么在Lambda表达式中使用该元素的属性或方法时就会抛出空指针异常。 在你提供的代码中,当使用Lambda表达式中的`o.getId()`时,如果`o`的`id`属性为空,会抛出空指针异常。正常情况下,`list`不为空,最多会抛出`NumberFormatException`,但在这里抛出的却是空指针异常。 要解决这个问题,你可以在Lambda表达式中添加空值判断。例如,可以使用`Optional`来对`o.getId()`进行空值检测,避免抛出空指针异常。可以使用似下面的代码来处理: ``` list.stream() .map(o -> Optional.ofNullable(o.getId()).map(Long::valueOf).orElse(null)) .collect(Collectors.toList()); ``` 通过使用`Optional.ofNullable`方法来包装`o.getId()`,如果`o.getId()`为空,就返回`null`,否则将其转换为`Long`型。这样做可以避免空指针异常的发生,让代码更加健壮。 引用: - lambda表达式中list.stream().map(o -> Long.valueOf(o.getId())).collect(Collectors.toList());报出了NPE,正常情况下list不为空不会发生NPE,最多o.getId()中id为空Long.valueOf(null)为空抛出NumberFormatException,但是最终却是因为id为空抛出了NPE。 - 此时为空指针异常NPE,而不是NumberFormatException - 本教程为授权出品教程 本套视频涵盖了 Java8 的新特性:Lambda表达式、强大的 Stream API、全新时间日期 API、...Java8 的新特性使 Java 的运行速度更快、代码更少(Lambda 表达式)、便于并行、最大化减少空指针异常。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [lambda表达式中奇怪的NullPointerException异常](https://blog.csdn.net/loveyour_1314/article/details/121668039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [通俗易懂的Java8新特性教程(含配套资料)](https://download.csdn.net/download/weixin_26875051/19651829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值