lambda表达式的本质
作为函数式接口的实例对象
函数式接口
1.一个接口中,只定义了一个抽象方法,则为函数式接口
2.可以在接口上显示加上@functionalInterface注解,来控制只有一个抽象方法
例子
函数式接口 = (形参列表)-> {方法体} 这是规范的模型
lambda表达式的具体语法
1.无参,有参规范模型
1.Runnable r = ()-> {方法体}
2.Consumer(String s)-> {sout(s)}
2.有参,数据 类型省略(接口泛型类型,和抽象方法参数类型一致时)
Consumer<String> c = (s) -> {sout(s)}
3.参数只有一个时可以省略()
1.Consumer<String> c = s -> {sout(s)}
2.Consumer<String> c =(String s) -> {sout(s)}
4.当 方法体 只有 一句时,可以省略大括号,并且若这一句是return的话,return也可省略
Comparator<Integer> c = (x,y) -> Integer.compare(x,y)
方法引用(Lambda表达式的简化)
1.理解:方法体去调用其他类或对象的方法的时候可以采用,就是方法体已经有实现的方法来代替了,智取要调用即可
2.要求注意:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的
方法的参数列表和返回值类型保持一致!
3.如下三种主要使用情况
对象::实例方法名
类::静态方法名
类::实例方法名(特别注意)
使用条件:1.函数式接口方法有两个参数
2.第一个参数是引用方法的调用者
3.第二个参数是引用方法的参数
例如:BitPredicate<String,String> b = (x,y)->{x.equals(y)}
BitPredicate<String,String> b = String::equals
构造器引用(Lambda的简化)
1.同样满足:接口和方法引用的参数列表一致,返回值类型一致
2.只是特例化:方法引用变成了构造方法
3.使用格式:ClassName::new
4.例子:Function<Integer,MyClass> f = (n)->new Myclass(n)
Function<Integer,Myclass> f = Myclss::new
数组引用
和构造器引用一样,只是构造器为数组
例子:Function<Integer,String[]> f = (length)-> new String[length]
Function<Integer,String[]> f = String[]::new