• 标准格式:(形参)->{代码块}
      • () 可以无参数,写参数的方式和方法里面的参数一样
      • -> 用箭头指向后面要做的事情,固定写法
      • {} 包含一段代码,我们称之为代码块,可以看成是方法体中的内容
    • 简写方式
      • 参数类型可以省略,但是若有多个参数,不能省略
      • 如果只有一个参数,小括号可以省略
      • 如果代码块只有一条语句,可以省略大括号和分号,甚至是return
    • 注意事项:
      • 使用Lambda必须有一个接口,接口中有且仅有一个抽象方法。
      • 必须要有上下文环境,才能推导出Lambda对应的接口
        • 根据局部变量赋值,得知Lambda对应的接口:Runnable =0->System.out.println(“Lambda表达式”);
        • 根据调用方法的参数得知Lambda对应的接口:new Thread(()->System.out.println(“Lambda表达式”)).start();
    • 和匿名内部类区别
      • 所属类型不同
        • 匿名内部类可以是接口也可以是抽象类,还可以是具体类
        • Lambda只能是接口
      • 使用限制不同
        • 接口中如果有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类。
        • 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
      • 实现原理不同
        • 匿名内部类:编译之后,产生一个单独的.class字节码文件
        • Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成。
    • 例子 ```java public class Demo { public static void main(String[] args) {

      1. //方式一
      2. MyRunnable my = new MyRunnable() ;
      3. Thread t1 = new Thread(my,"t1");
      4. t1.start();
      5. //方式二 匿名内部类
      6. new Thread(new Runnable() {
      7. @Override
      8. public void run() {
      9. System.out.println("多线程启动了");
      10. }
      11. }) .start();
      12. //lambda表达式
      13. new Thread(()-> System.out.println("多线程启动了")).start();

      } }


    public class MyRunnable implements Runnable{ @Override public void run(){ System.out.println(“多线程启动了”); } }

    1. ```java
    2. /*
    3. 定义一个接口(Eatable),里面定义一个抽象的方法:void eat()
    4. 定义一个测试类,在测试类中提供两个方法:
    5. 一个方法是:useEatable
    6. 一个方法是主方法,在主方法中调用useEatable()方法
    7. */
    8. public class Demo {
    9. public static void main(String[] args) {
    10. useEatable(()-> System.out.println("ssss"));
    11. }
    12. public static void useEatable(Eatable e){
    13. e.eat();
    14. }
    15. }
    16. ************************************************************************************
    17. public interface Eatable {
    18. void eat() ;
    19. }
    1. /*
    2. 定义一个接口(Flyable),里面定义一个抽象方法:void fly(String s)定义一个测试类,在测试类中提供两个方法:
    3. 一个方法是:useFlyable(Flyable f)
    4. 一个方法是主方法:在主方法中调用useFlyable
    5. */
    6. public class Demo {
    7. public static void main(String[] args) {
    8. useFlyable((s)->{
    9. System.out.println("ssssss");
    10. System.out.println(s);});
    11. }
    12. public static void useFlyable(Flyable s){
    13. s.fly("66666666666666");
    14. }
    15. }
    16. **********************************************************************************
    17. public interface Flyable {
    18. void fly(String s) ;
    19. }
    1. /*
    2. 定义一个接口(addable),里面定义一个抽象方法:int add(int x,int y);
    3. 定义一个测试类,在测试类中提供两个方法:
    4. 一个方法是:useAddable(Addable a)
    5. 一个方法是主方法:在主方法中调用useAddable
    6. */
    7. public class Demo {
    8. public static void main(String[] args) {
    9. useAddable((int s1,int s2)-> s1+s2 );
    10. }
    11. public static void useAddable(Addable s){
    12. int i = s.add(5,6);
    13. System.out.println(i);
    14. }
    15. }
    16. ************************************************************************************
    17. public interface Addable {
    18. int add(int x,int y) ;
    19. }