概述:

一、Lambda 表达式的基础语法:Java8中引入了一个新的操作符 “->” 该操作符称为箭头操作符或 Lambda 操作符
箭头操作符将 Lambda 表达式拆分成两部分:

左侧:Lambda 表达式的参数列表,对应于接口中抽象方法的参数列表
右侧:Lambda 表达式中所需执行的功能(对应抽象方法实现的功能), 即 Lambda 体

语法格式一:无参数,无返回值
() -> System.out.println(“Hello Lambda!”);

语法格式二:有一个参数,并且无返回值
(x) -> System.out.println(x)

语法格式三:若只有一个参数,小括号可以省略不写
x -> System.out.println(x)

语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
Comparator com = (x, y) -> {
System.out.println(“函数式接口”);
return Integer.compare(x, y);
};

语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
Comparator com = (x, y) -> Integer.compare(x, y);

语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
(Integer x, Integer y) -> Integer.compare(x, y);

上联:左右遇一括号省
下联:左侧推断类型省
横批:能省则省

案例代码

语法格式一:无参数,无返回值

  1. /* 语法格式一:无参数,无返回值
  2. () -> System.out.println("Hello Lambda!");*/
  3. @Test
  4. public void ceui1() {
  5. Runnable helloworld = new Runnable() {
  6. @Override
  7. public void run() {
  8. System.out.println("helloworld");
  9. }
  10. };
  11. helloworld.run();
  12. System.out.println("-------------------");
  13. Runnable r1 = () -> System.out.println("语法格式一:无参数,无返回值");
  14. r1.run();
  15. }

语法格式二:有一个参数,并且无返回值

语法格式二看语法格式三的案例

语法格式三:若只有一个参数,小括号可以省略不写

  1. /**
  2. * 语法格式二:有一个参数,并且无返回值
  3. * (x) -> System.out.println(x)
  4. * 语法格式三:若只有一个参数,小括号可以省略不写
  5. * x -> System.out.println(x)
  6. */
  7. @Test
  8. public void ceui2() {
  9. Consumer<String> consumer = new Consumer<String>() {
  10. @Override
  11. public void accept(String s) {
  12. System.out.println(s);
  13. }
  14. };
  15. consumer.accept("原生的匿名内部类方式");
  16. System.out.println("----------------------");
  17. Consumer<String> con = x -> System.out.println(x);
  18. con.accept("语法格式二:有一个参数,并且无返回值");
  19. }

语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句

  1. /**
  2. * 语法格式四:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
  3. * Comparator<Integer> com = (x, y) -> {
  4. * System.out.println("函数式接口");
  5. * return Integer.compare(x, y);
  6. * };
  7. */
  8. @Test
  9. public void ceui3() {
  10. Comparator<Integer> com = new Comparator<Integer>() {
  11. @Override
  12. public int compare(Integer o1, Integer o2) {
  13. return Integer.compare(o1, o2);
  14. }
  15. };
  16. int compare = com.compare(2, 5);
  17. System.out.println("compare = " + compare);
  18. System.out.println("-----------");
  19. Comparator<Integer> com2 = (x, y) -> {
  20. System.out.println("函数式接口");
  21. return Integer.compare(x, y);
  22. };
  23. int compare1 = com2.compare(2, 5);
  24. System.out.println("compare1 = " + compare1);
  25. }

语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写

  1. /**
  2. * 语法格式五:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
  3. * Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
  4. */
  5. @Test
  6. public void ceui4() {
  7. Comparator<Integer> com4 = (Integer x, Integer y) -> Integer.compare(x, y);
  8. int compare2 = com4.compare(2, 5);
  9. System.out.println("compare2 = " + compare2);
  10. }

语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,

  1. /**
  2. * * 语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,
  3. * 因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
  4. * * (Integer x, Integer y) -> Integer.compare(x, y);
  5. */
  6. @Test
  7. public void ceui5() {
  8. Comparator<Integer> com4 = (x, y) -> Integer.compare(x, y);
  9. int compare2 = com4.compare(2, 5);
  10. System.out.println("compare2 = " + compare2);
  11. }