Lambda表达式

Lambda的语法非常简洁,完全没有面向对象复杂的束缚(思想:做什么,而不是怎么做)
  • 1. 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法,允许多个default方法和静态方法实现。
    • 无论是JDK内置的Runnable 、Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。
  • 2. 使用Lambda必须具有上下文推断。
    • 方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
备注:有且仅有一个抽象方法的接口,称为“函数式接口”。
 
Lambda标准格式
Lambda省去面向对象的条条框框,格式由3个部分组成:
  • 一些参数
  • 一个箭头
  • 一段代码
Lambda表达式的标准格式为:
  • (参数类型 参数名称) ‐> { 代码语句 }
格式说明:
  • 小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。
  • -> 是新引入的语法格式,代表指向动作。
  • 大括号内的语法与传统方法体要求基本一致。
 1 public interface Cook {
 2     void makeFood();
 3 }
 4 
 5 public class Demo2InvokeCoke {
 6     public static void main(String[] args) {
 7         invokeCoke(()->{
 8             System.out.println("吃饭啦!");});
 9         
10         invokeCoke(()-> System.out.println("吃饭啦!"));
11     }
12 
13     private static void invokeCoke(Cook cook) {
14         cook.makeFood();
15     }
16 }
17 
18 //==============================================================
19 
20 public class Demo3Comparator {
21     public static void main(String[] args) {
22         Person[] array = {
23                 new Person("张三2", 18),
24                 new Person("张三1", 20),
25                 new Person("张三3", 19)
26         };
27         /*Arrays.sort(array, new Comparator<Person>() {
28             @Override
29             public int compare(Person o1, Person o2) {
30                 return o1.getAge() - o2.getAge();
31             }
32         });*/
33         Arrays.sort(array,(Person p1, Person p2)->{
34             return p1.getAge() - p2.getAge();});
35         for (Person person : array) {
36             System.out.println(person);
37         }
38     }
39 }
40 
41 //=============================================================
42 public class Demo1LambdaRunnable {
43     public static void main(String[] args) {
44         new Thread(() -> System.out.println("多线程任务执行!")).start();
45     }
46 }
47 
48 //================================================================
49 public interface Calculator {
50     int calc(int a, int b);
51 }
52 public class Demo4InvokeCalc {
53     public static void main(String[] args) {
54         System.out.println(invokeCalc(120,130,(int a,int b)->{
55             return a + b;}));
56     }
57 
58     public static int invokeCalc(int a, int b, Calculator calculator) {
59         return calculator.calc(a, b);
60     }
61 }
 1 @FunctionalInterface
 2 interface Foo{
 3  
 4 // public void sayHello() ;
 5 // public void say886() ; 
 6  public int add(int x,int y);
 7  
 8  default int div(int x,int y) {
 9    return x/y;
10  }
11  
12  public static int sub(int x,int y) {
13    return x-y;
14  }
15 }
16 
17 /**
18  * 
19  * @Description: Lambda Express-----> 函数式编程
20  * 1 拷贝小括号(形参列表),写死右箭头 ->,落地大括号 {方法实现}
21  * 2 有且只有一个public方法@FunctionalInterface注解增强定义
22  * 3 default方法默认实现
23  * 4 静态方法实现
24  */
25 public class LambdaDemo {
26      public static void main(String[] args){
27 //  Foo foo = new Foo() {
28 //   @Override
29 //   public void sayHello() {
30 //     System.out.println("Hello!!");
31 //   }
32 //
33 //   @Override
34 //   public void say886() {
35 //     // TODO Auto-generated method stub
36 //     
37 //   }
38 //  };
39 //  foo.sayHello();
40 //  System.out.println("============");
41 //  foo = ()->{System.out.println("Hello!! lambda !!");};
42 //  foo.sayHello();
43  
44      Foo foo = (x,y)->{
45            System.out.println("Hello!! lambda !!");
46            return x+y;
47      };
48    
49    int result = foo.add(3,5);
50    System.out.println("******result="+result);
51    System.out.println("******result div="+foo.div(10, 2));
52    System.out.println("******result sub="+Foo.sub(10, 2));
53    
54  }
55 }

省略规则

在Lambda标准格式的基础上,使用省略写法的规则为:

  • 小括号内参数的类型可以省略;
  • 如果小括号内有且仅有一个参,则小括号可以省略;
  • 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。

演变

 1 public class TestLambda {
 2 
 3     static class Foo2 implements Foo {
 4 
 5         @Override
 6         public void foo() {
 7             System.out.println("静态内部类实现~~~");
 8         }
 9     }
10 
11     public static void main(String[] args) {
12         Foo foo = null;
13 
14         //1.外部实现类
15         foo = new Foo1();
16         foo.foo();
17 
18         //2.静态内部类
19         foo = new Foo2();
20         foo.foo();
21 
22         //3.局部内部类
23         class Foo3 implements Foo {
24             @Override
25             public void foo() {
26                 System.out.println("局部内部类实现~~~");
27             }
28         }
29         foo = new Foo3();
30         foo.foo();
31 
32         //4.匿名内部类
33         foo = new Foo() {
34             @Override
35             public void foo() {
36                 System.out.println("匿名内部类实现~~~");
37             }
38         };
39         foo.foo();
40 
41         //5.Lambda表达式
42         foo = () -> System.out.println("Lambda表达式实现~~~");
43         foo.foo();
44 
45     }
46 
47 
48 }
49 
50 interface Foo {
51     void foo();
52 }
53 
54 class Foo1 implements Foo {
55 
56     @Override
57     public void foo() {
58         System.out.println("外部类实现~~~");
59     }
60 }

 

 

posted @ 2020-12-09 11:41  夜小十五天  阅读(151)  评论(0编辑  收藏  举报