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 }