zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    HDFS文件系统
    使用cmake安装单实例mysql
    python读取数据库表数据并写入excel
    linux文件行数统计
    ORACLE清空回收站操作
    Oracle 11g静默安装
    图解Java设计模式之职责链模式
    图解Java设计模式之策略模式
    图解Java设计模式之状态模式
    图解Java设计模式之解释器模式
  • 原文地址:https://www.cnblogs.com/wuweibincqu/p/14107708.html
Copyright © 2011-2022 走看看