凡是确定的东西,都要删掉
Runnable r2 = () -> {sout("....")};
Comparator<Integer> com1 = (o1,o2) ->Integer.compare(o1,o2) ;
//方法引用
参数也是一样的
Comparator<Integer> com2 = Integer :: compare;
Lambda表达式的使用举例:
格式
->:箭头操作符
左边:对应着要重写的方法的形参列表
右边:重写的方法的方法体
只有一条语句可以直接省略大括号和return
接口只有一个抽象方法的场景
六个格式
1.无参无返回值:run方法
2.只有一个参数没返回值
3.和上面一样,增加了一个类型推断,类型可以省略
int[] arr = {};
Hashmap<String,Integer> map = new HashMap<>();
var entryset = mao.entrySet(); jdk10以后
4.只有一个参数的时候,小括号可以省略
5.有大括号和返回值的时候,删除大括号也得删除返回值
函数式接口?
什么是函数式接口
lambda表达式看做一个匿名函数
匿名函数是一个对象
先造类实现接口再造对象调用,有点重,所以java就学些了别人的优点
函数式编程思想:不注重过程,注重结果,lambda表达式也是一个对象
什么是函数式接口?
只声明了一个抽象方法,则此接口就是函数式接口
基本的函数式接口(4个)
接口 抽象方法
Consumer<T> 消费型接口 void accept(T t)
Supplier<T> 供给型接口 T get()
Function<T>函数型 R apply(T t)
Predicted<T>判断型接口 boolean test(T t)
函数式接口都有在java.util.funtion包下
总结: 形参列表 -> {方法体};
构造器应用/方法引用
Integer :: compare
如何理解??
>方法引用看做基于lambda表达式的进一步刻画
当需要提供一个函数式接口的实例时,可以使用lambda表达式
>当满足一定的条件的情况下,我们还可以使用方法引用或构造器应用替换lambda表达式
方法引用的本质 ->作为了函数式接口的实例
格式
类(或对象):: 方法名
情况1:
对象 :: 实例方法
要求抽象方法A和内部实现的调用的某个方法B的形参和返回值都相同,可以用b对a进行覆盖
注意:此方法b是非静态的方法
类 :: 静态方法
基本同上
类 :: 实例方法
调用的方法的调用者是形参的第一个参数,返回值相同
println 和 accept方法参数和返回值一样,把println看做accept的一个覆盖
Consumer<String> com2 = System.out :: println;
要求:函数时间接口中的抽象方法a和调用的方法b的返回值相同
同时抽象方法有n个参数,b有n-1个方法
且抽象方法a的第一个参数作为方法b的调用者
且a的后n-1个参数和方法b的形参相同或一致
就可以使用b对a进行覆盖或引用
(b是一个非静态的方法,需要对象调用,但是形式上使用所属的类来调用)
构造器引用/数组引用
Employee :: new
类名 :: new
说明:
>调用了类名对应的类中的某一个确定的构造器
>具体调用的类中的哪一个构造器,取决于函数式接口的抽象方法的形参列表
数组引用
数组名[] :: new;