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;
    }
}

注意:

当接口中的方法没有参数时,则调用的为类中的无参构造,即接口中的方法的参数列表要与需要调用的构造器的参数列表一致

posted @ 2021-04-19 14:04  瓜铺  阅读(1254)  评论(0)    收藏  举报