- 未用lambda表达式的效果
1. 因为Thread构造参数是一个接口,所以我才不得不用Runnable接口。
2. 因为接口不能直接new对象,所以我才不得不用一个实现类。
3. 因为单独定义一个Impl实现类太麻烦,所以我才不得不用匿名内部类。
4. 因为接口当中有抽象方法,所以我才不得不覆盖重写。
5. 因为覆盖重写有要求,所以我才不得不照抄一遍run方法,不能写错。
6. 而实际上,只有run方法的方法体才是我要真正做的事情。
每个方法其实都可以对应到“前中后”三点上: 前:小括号,方法的参数,前置条件。 中:大括号,方法体,具体要做什么事情。 后:返回值,最终产生什么结果。
对于Comparator当中的compare方法,也可以对应到三点上: 1. 前:两个参数,给我来两个对象,我才能比较。 2. 中:我要执行减法。 3. 后:我这个方法最终将会产生一个int结果。 同样三点,在Lambda表达式当中也可以进行体现。
引出lambda 表达式。
- 函数式编程思想(区别于面向对象思想)
Y=f(X);
函数式编程的优点:简单、直观,没有面向对象那么复杂的语法。
- Lambda体验
这个是对匿名内部类的复习并结合者lambda的使用
4. Lambda标准格式
(1) 一些参数
(2)一个箭头
(3)一些代码
格式:(参数) -> {方法体}
(一些参数) -> {方法体} 拿什么东西 -> 做什么事情
使用Lambda标准格式使用Runnable与Comparator接口
new Thread(() -> { System.out.println("abc"); }).start();
Arrays.sort(array, (Person a, Person b) -> { return a.getAge() - b.getAge(); })
5. Invoke关键字以及lambda注意事项
6. 省略格式的宗旨、注意事项
7. 使用Lambda省略格式使用Runnable与Comparator接口
new Thread(() -> System.out.println("abc")).start();
Arrays.sort(array, (a, b) -> a.getAge() - b.getAge())
8. Lambda练习
- 能够通过Lambda的标准格式使用自定义的接口(有且仅有一个抽象方法)
- 能够通过Lambda的省略格式使用自定义的接口(有且仅有一个抽象方法)
参见代码:
MyInterfaceNoParam没有参数
MyInterfaceOneParam一个参数
MyInterfaceTwoParam两个参数
MyInterfaceReturn
9. Lambda的使用前堤
Lambda的语法非常简洁,完全没有面向对象复杂的束缚。但是使用时有几个问题需要特别注意:
- 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。
无论是JDK内置的 Runnable 、 Comparator 接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。
- 使用Lambda必须具有上下文推断。
也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。