lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法

在jdk8之前,一个方法能接受的参数都是变量,但是我们在传入变量的同时 也可以传入一个方法(动作),我们可能会想到匿名内部类
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第1张图片
在这里插入图片描述
如果一个接口需要 或者想被替换成一个lambda表达式,那么这个接口中,只能含有一个抽象方法,如果有多个抽象方法 就不能使用lambda表达式,加了静态方法和默认方法的接口并不影响这个接口成为一个函数是接口
默认方法
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第2张图片
接口当中的默认方法一定要有实现
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第3张图片
静态方法
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第4张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第5张图片
对于上述函数式接口的定义,比如 Runnable,Callable,Filefilter等等.我们来看看jdk8文档
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第6张图片
Supplier 无参数 返回一个结果
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第7张图片
在这里插入图片描述

Function 接受一个参数,返回一个结果
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第8张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第9张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第10张图片
Consumer 接受一个输入参数,无返回结果
This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
在这里插入图片描述
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第11张图片
Predicate 接受一个输入参数,返回一个布尔值结果
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第12张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第13张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第14张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第15张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第16张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第17张图片
接下来我们写个简单的例子,便于一步一步理解精髓
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第18张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第19张图片
在这里插入图片描述
方法引用
方法引用其实就是对lambda表达式的进一步简化
有时一个很简单的lamdba表达式其实就是调用了一个现有的方法,比如 s->System.out.println(s),这个表达式只是调用了打印方法而已,那么如果我们能直接使用一个方法来代替它就好了,这个时候方法引用就处理了。
方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法,方法引用提供了一种引用而不执行的方式,它需要由兼容的函数式接口构成的目标类型上下文,计算时,方法引用会创建函数式接口的一个实例。
方法引用的唯一用途是支持lamdba表达式的简写,提高了代码的可读性,也是程序逻辑变得更清晰
在这里插入图片描述
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第20张图片
由此,我们可以写为
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第21张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第22张图片
我们简化 传方法引用
在这里插入图片描述
在这里插入图片描述
这里有点像借用了c++ 作用域表达式语法。我们再来
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第23张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第24张图片
接下来可以简化这个lamdba表达式
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第25张图片
图中 引用的是一个静态方法 下面我们引用一个非静态的方法 看是否报错
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第26张图片
结果也没有报错 而且顺利执行了,说明 通过方法引用简化lamdba表达式,被引用的方法可以是静态的 也可以是非静态的
也可以引用类的构造方法
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第27张图片
新增注解类型
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第28张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第29张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第30张图片
org.checkerframework 校验的两个注解 @Nullable @Nonnull
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第31张图片
这是一个很好的工具 ,在代码编译的时候 就能够排查出一些错误
Optional工具类
空指针异常是java应用程序失败的最常见原因,以前为了解决空指针异常,Google著名的Guava项目引入了Option类 Guava通过使用检查空值的方式来防止代码污染,受到谷歌Guava的启发,Optional类已经成了java8库的一部分
Optional类实际上是一个容器,它可以保存类型T的值,或许仅仅保存null,Optional提供很多有用的方法,这样我们不用显式的进行控制检测。
创建Optional对象的几个方法:
1 Optional of(T Value) 返回一个Optional对象,value不能为空,否则会出空指针异常
2 Optional.OfNullable(T value),返回一个Optional对象,value可以为空
3 Optional.empty(), 代表空
其他Api
1.Optional.isPresent() 是否存在值(不为空)
2.ifPresent(Consumer)consumer 如果存在值则执行consumer
3.Optional.get() 获取value
4. orElse(T other) 如果没有值则返回other
5. orElseGet(Supplier other) 如果没值则执行other并返回
6. orElseThrow(Supplier exceptionSupplier) 如果没值则执行 exceptionSupplier 并抛出异常
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第32张图片
在这里插入图片描述
在这里插入图片描述
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第33张图片
lamdba表达式方法 构造方法,函数式接口,默认方法 构造方法_第34张图片
Optional总结 使用option时,尽量不要直接调用 optional.get()方法,optional更应该被视为一个私有方法,应依赖于其他像Optional.orElse(),optional.orElseGet(),optional.map()等这样的方法

你可能感兴趣的:(lambda,stream流编程)