Java8中引入的“新功能”,用起来确实很方便,它的关键是
**

  1. 允许将“方法”作为参数来进行传递
  2. “方法”的定义分成两部分

**
紧抓这两个点,就能很好的使用Lambda表达式了

演变

在程序编写过程中,我们总会 多态 这种情况,比如:

  1. public class LearnLambdaNormal {
  2. // 动物
  3. interface Animal {
  4. void eat(String food);
  5. }
  6. public static void main(String[] args) {
  7. // 猫
  8. Animal cat = new Animal() {
  9. public void eat(String food) {
  10. System.out.println(String.format("猫要吃:%s", food));
  11. }
  12. };
  13. // 狗
  14. Animal dog = new Animal() {
  15. public void eat(String food) {
  16. System.out.println(String.format("狗要吃: %s", food));
  17. }
  18. };
  19. // 人
  20. class Person {
  21. public void feed(Animal animal, String food) {
  22. animal.eat(food);
  23. }
  24. }
  25. Person person = new Person();
  26. // 喂小动物
  27. person.feed(cat, "鱼干");
  28. person.feed(dog, "骨头");
  29. }
  30. }

34、35 行,我们最终的目的,其实是想要执行一个方法而已,但我们却额外的定义了一个接口 Animal 和两个类 catdog ,而 Animal 接口就一个方法,只是方法的内部实现不一样而已,那能不能提供一种机制,让我们

传递要执行的方法 呢?

这时候就需要用到 Lambda表达式了,如果用 Lambda表达式改写上面的代码,就简化成了

  1. public class LearnLambdaExpress {
  2. public static void main(String[] args) {
  3. // 人
  4. class Person {
  5. public void feed(Consumer<String> animal, String food) {
  6. animal.accept(food);
  7. }
  8. }
  9. Person person = new Person();
  10. // 喂小动物
  11. person.feed(x -> System.out.println(String.format("猫吃: %s", x)), "鱼干");
  12. person.feed(x -> System.out.println(String.format("够吃: %s", x)), "骨头");
  13. }
  14. }

在第 1415 行,直接实现了我们的目的,执行不同的方法,是不是简单很多

抽象

Java8提供的抽象

定义自己的抽象

特点

限制

不可变

并行