Lambda表达式
创始人
2024-03-13 03:22:58
0

注:函数式接口和Lamda的区别

函数式接口:即只有一个抽象方法的接口,而这一个抽象方法的接口可以由Lamda表达式来实现。

1.Lambda表达式

1.1 省略规则

  1. 参数类型可以省略
  2. 方法体只有一句代码时大括号和唯一一句代码的分号可以省略
  3. 方法只有一个参数时小括号可以省略

2.Stream 流

2.1常用操作

2.2.1 创建流

2.2.2 中间操作

2.2.2.1 filter

可以对流中的元素进行条件过滤,符合过滤条件的才能继续留在流中

2.2.2.2 map

可以对流中的元素进行计算或转换

如上就是把原本流中的是Author对象类型,现在变成String类型

2.2.2.3 distinct

可以去除流中的重复元素

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

2.2.2.4 sorted

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

注意:如果调用空参的sorted()方法,需要流中的元素是实现了Comparable

2.2.2.5 flatMap

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

例子一

例子二

2.2.3 终结操作

注意:如果没有终结操作,流里面的方法是不会生效的

2.2.3.1 forEach

2.2.3.2 count

获取当前流中元素的个数

2.2.3.3 min&max

2.2.3.4 collect

把当前的流转换成集合

2.2.3.5 查找与匹配 anyMatch

返回值是boolean类型的

2.2.3.6 查找与匹配 allMatch

是否所有的元素都符合条件,只有所有都符合时才返回true

2.2.3.7reduce

reduce归并

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

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

3.Optional

在JDK8中引入Optional更优雅的避免空指针

使用Optional类就可以避免在程序中使用一堆的if来处理空了。下表列出Optional类中的方法:

方法名

描述

empty

返回一个空的Optional实例

of

将指定值用Optional封装后返回,如果值为null,则抛出NullPointerException异常

ofNullable

将指定值用Optional封装后返回,如果值为null,则返回空的Optional对象

get

如果值存在,则返回该值,否则抛出NullPointerException异常

isPresent

检查值是否存在,存在返回true,否则返回false

ifPresent

如果值存在,就执行使用该值的方法调用,否则什么都不做

filter

如果值存在并且满足提供的谓词,就返回包含该值的Optional对象,否则返回空的Optional对象

map

如果值存在,就对该值执行提供的mapping函数调用

flatMap

如果值存在,就对该值执行提供的mapping函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象

orElse

如果值存在就将其返回,否则返回指定的的值

orElseGet

如果值存在就将其返回,否则返回由指定的Supplier接口生成的值

orElseThrow

如果值存在就将其返回,否则抛出由指定的Supplier接口生成的异常

1.1 empty(不常用)

Optional user = Optional.empty();

创建一个空的Optional对象

1.2 of(不常用)

User user = null; Optional optional = Optional.of(user);

user为空,直接报NullPointerException异常,因此该方法一般很少用。

1.3 ofNullable

User user = null; Optional optional = Optional.ofNullable(user);

user为空,则返回空的Optional对象

1.4 get

User user = null; Optional optional = Optional.ofNullable(user); optional.get();

从Optional中获取值,如果值不存在则抛出如下异常:java.util.NoSuchElementException: No value present

1.5 isPresent

User user = null; Optional optional = Optional.ofNullable(user); optional.isPresent();

以上例子返回false,如果user不为空,则返回true

1.6 ifPresent

User user = null; Optional optional = Optional.ofNullable(user); optional.ifPresent(us->{ //user不为空,执行 });

1.7 filter

User user = new User(); user.setName("小A"); boolean result = Optional.ofNullable(user).filter(us -> "小A".equals(us.getName())).isPresent();

如果用户名为小A,则返回true,否则返回false

1.8 map

User user = new User(); user.setName("小A"); String name = Optional.ofNullable(user).map(User::getName).get();

如果user不为空,则抽取name属性,使用get()获取。这里如果name为空,则会报异常,因此通常都是指定默认值或使用自定义异常抛出。

String name = Optional.ofNullable(user).map(User::getName).orElse("");

String name = Optional.ofNullable(user) .map(User::getName) .orElseThrow(()->new RuntimeException("用户名不能为空"));

1.9 flatMap

该方法一般用于从类中获取其他类的中某个属性,比如一个班级里面有学生,学生里面有地址,现在需要获取这个班级下的某个学生的地址,按之前的写法:

Address address = new Address(); address.setAddr("天河区"); Student student = new Student(); student.setName("小A"); student.setAddress(address); Grade grade = new Grade(); grade.setName("三年级2班"); grade.setStudent(student); if(!ObjectUtils.isEmpty(grade)){ Student student1 = grade.getStudent(); if(!ObjectUtils.isEmpty(student1)){ Address address1 = student1.getAddress(); if(!ObjectUtils.isEmpty(address1)){ System.out.println(address1.getAddr()); } } }

为了程序不出问题,就会写一大堆的if来判断,下面用flatMap来看下怎么实现:

Optional.ofNullable(grade) .flatMap(g->Optional.ofNullable(g.getStudent())) .flatMap(s->Optional.ofNullable(s.getAddress())) .map(Address::getAddr) .orElse("")

Optional.ofNullable(grade) .map(Grade::getStudent) .map(Student::getAddress) .map(Address::getAddr) .orElse("")

3.1使用

3.1.1创建对象

Optional就好像是包装类,可以把我们的具体数据封装到 Optional对象内部,然后我们去使用 Optional中封装好的方法操作封装进去的数据就可以优雅的避免空指针。

我们一般使用 Optional的静态方法ofNullable来吧数据封装成一个 Optional对象,无论传入参数是否为null 都不会报错。

Author author=new Author();

Optional authorOptional=Optional.ofNullable(author);

而实际开发中我们数据很多是从数据库中获取的,Mybatis3.5版本以后也已经可以支持 Optional了。我们可以直接在Dao方法的返回值类型定义成 Optional类型,Mybatis会自己把数据封装成Optional对象返回。

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...