lambda表达式的使用规则规则总结
lambda表达式是做什么的?
lambda表达式是匿名内部类的另一种写法,直接作用就是为了简化代码,使代码更简洁,方便阅读,此外其他语言中lambda表达式基本是伴生的,而Java迟迟到Java8才开始加入。
什么时候可以用lambda表达式
需要有一个待实现的接口,且接口中只能有一个方法需要被实现(即函数式接口/功能性接口)
@FunctionalInterface//这个注释是为了说明此接口为功能性接口
interface LambdaInterface{
void learnLambda(String str);
}
怎么用lambda表达式?
//(),lambda表达的参数列表
//{},lambda表达式方法体
//->.lambda表达式运算符
写法与精简规则
- 参数的数据类型可以省略,多参数时,省略时需全部省略方可
- 参数的小括号,当只有一个参数时,可以省略小括号
- 方法体的大括号,方法体中只有一句代码的时候,可以省略大括号
- 如果方法体中唯一的语句为返回语句,则省略大括号同时需要再省略return
public class LambdaTest {
public static void main(String[] args) {
NoReturnNoParemeter lam1 = () -> {System.out.println("无参无返回"); };
NoReturnNoParemeter lam11 = () -> System.out.println("无参无返回"); //精简版本
NoReturnOneParemeter lam2 = (int a) -> { System.out.println("无返回值单参"); };
NoReturnOneParemeter lam22 = a -> System.out.println("无返回值单参");//精简版本
NoReturnMutiParemeter lam3 = (int a,int b,int c) -> { System.out.println("无返回多参"); };
NoReturnMutiParemeter lam33 = (a,b,c) ->System.out.println("无返回多参"); //精简版本
SingleReturnNoParemeter lam4 = () -> {return 1;};//有返回无参
SingleReturnNoParemeter lam44 = () -> 1;//精简版本
SingleReturnOneParemeter lam5 = (int a) -> {return 1;};//单参有返回
SingleReturnOneParemeter lam55= a -> 1;//精简版本
SingleReturnMutiParemeter lam6 = (int a, int b) -> {return 1;};//多参有返回
SingleReturnMutiParemeter lam66 = (a, b) ->1;//精简版本
}
}
@FunctionalInterface
interface NoReturnNoParemeter{
void test();
}
@FunctionalInterface
interface NoReturnOneParemeter{
void test(int a);
}
@FunctionalInterface
interface NoReturnMutiParemeter{
void test(int a, int b, int c);
}
@FunctionalInterface
interface SingleReturnNoParemeter{
int test();
}
@FunctionalInterface
interface SingleReturnOneParemeter{
int test(int a);
}
@FunctionalInterface
interface SingleReturnMutiParemeter{
int test(int a, int b);
}
lambda的方法引用
将一个lambda表达式的实现只要一个已经实现的方法,可以引用此方法。
语法:方法的隶属者::方法名
public class LambdaMethod {
public static void main(String[] args) {
LambdaTemp lamMethod = () -> method1();//精简版本的方法引用
LambdaTemp lamMethod2 = LambdaMethod::method1;//lambda表达式中方法引用的专有语法
}
public static void method1(){
System.out.println("lambda的方法引用");
}
}
@FunctionalInterface
interface LambdaTemp{
void test();
}
注意:
- 引用的方法参数的数量和种类需要和接口的保持一致
- 返回值的类型也需要和接口中定义的一致
lambda构造方法的引用
当功能接口中的方法为返回一个类的对象时,可以通过lambda表达式引用
public class LambdaMethod {
public static void main(String[] args) {
LambdaTemp cat1 = Cat :: new;//调用无参构造器
}
}
@FunctionalInterface
interface LambdaTemp{
Cat getCat();
}
class Cat{
int age;
String name;
public Cat() {
}
public Cat(int age, String name) {
this.age = age;
this.name = name;
}
}
注意:
当接口中的方法没有参数时,则调用的为类中的无参构造,即接口中的方法的参数列表要与需要调用的构造器的参数列表一致
浙公网安备 33010602011771号