Java 中的 Lambda 表达式 - 掘金

举例

  1. public class LambdaTest {
  2. @Test
  3. public void test1(){
  4. Comparator<Integer> comparator = (num1,num2) -> Integer.compare(num1,num2);
  5. System.out.println(comparator.compare(21,30));
  6. }
  7. }

image.png

格式要求

->符号

该符号是Lambda操作符 或者 箭头操作符

左边

->的左边我们称之为 Lambda 表达式的形参列表,对应的就是接口中抽象方法的形参列表

右边

->的右边我们称之为 Lambda 表达式的表达式体,对应的就是重写的抽象方法的方法体

Lambda表达式的本质

作为接口的实例

Lambda表达式的使用

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

语法格式二:Lambda 需要一个参数,但是没有返回值

语法格式三:数据类型可以省略,“类型推断”

前三种使用情景:

  1. import org.junit.Test;
  2. import java.util.ArrayList;
  3. import java.util.function.Consumer;
  4. /**
  5. * Lambda表达式的使用
  6. *
  7. * 1.举例: (o1,o2) -> Integer.compare(o1,o2);
  8. * 2.格式:
  9. * -> :lambda操作符 或 箭头操作符
  10. * ->左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表)
  11. * ->右边:lambda体 (其实就是重写的抽象方法的方法体)
  12. *
  13. * 3.Lambda表达式的使用:(分为6种情况介绍)
  14. */
  15. public class LambdaTest1 {
  16. //语法格式一:无参,无返回值
  17. @Test
  18. public void test(){
  19. Runnable r1 = new Runnable() {
  20. @Override
  21. public void run() {
  22. System.out.println("长安欢迎您");
  23. }
  24. };
  25. r1.run();
  26. System.out.println("+++++++++++++++++++++++++|");
  27. Runnable r2 = () -> System.out.println("长安欢迎您");
  28. r2.run();
  29. }
  30. //语法格式二:Lambda 需要一个参数,但是没有返回值。
  31. @Test
  32. public void test2(){
  33. Consumer<String> con = new Consumer<String>() {
  34. @Override
  35. public void accept(String s) {
  36. System.out.println(s);
  37. }
  38. };
  39. con.accept("善与恶的区别是什么?");
  40. System.out.println("+++++++++++++++++++");
  41. Consumer<String> c1 = (String s) -> {
  42. System.out.println(s);
  43. };
  44. c1.accept("先天人性无善恶,后天人性有善恶。");
  45. }
  46. //语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”
  47. @Test
  48. public void test3(){
  49. Consumer<String> c1 = (String s) -> {
  50. System.out.println(s);
  51. };
  52. c1.accept("先天人性无善恶,后天人性有善恶。");
  53. System.out.println("---------------------");
  54. Consumer<String> c2 = (s) -> {
  55. System.out.println(s);
  56. };
  57. c2.accept("如果没有邪恶的话我们怎么会知道人世间的那些善良呢?");
  58. }
  59. @Test
  60. public void test4(){
  61. ArrayList<String> list = new ArrayList<>();//类型推断
  62. int[] arr = {1,2,3};//类型推断
  63. }
  64. }

语法格式四:Lambda若只需要一个参数时,参数的小括号可以省略

语法格式五:Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值

语法格式六:当Lambda体只有一条语句时,return与大括号若有,都可以省略

后三种适用情景

  1. import org.junit.Test;
  2. import java.util.Comparator;
  3. import java.util.function.Consumer;
  4. /**
  5. * Lambda表达式的使用
  6. *
  7. * 1.举例: (o1,o2) -> Integer.compare(o1,o2);
  8. * 2.格式:
  9. * -> :lambda操作符 或 箭头操作符
  10. * ->左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表)
  11. * ->右边:lambda体 (其实就是重写的抽象方法的方法体)
  12. *
  13. * 3.Lambda表达式的使用:(分为6种情况介绍)
  14. *
  15. * 总结:
  16. * ->左边:lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只有一个参数,其一对()也可以省略
  17. * ->右边:lambda体应该使用一对{}包裹;如果lambda体只有一条执行语句(可能是return语句),省略这一对{}和return关键字
  18. */
  19. public class LambdaTest1 {
  20. //语法格式四:Lambda若只需要一个参数时,参数的小括号可以省略
  21. @Test
  22. public void test5(){
  23. Consumer<String> c1 = (s) -> {
  24. System.out.println(s);
  25. };
  26. c1.accept("先天人性无善恶,后天人性有善恶。");
  27. System.out.println("---------------------");
  28. Consumer<String> c2 = s -> {
  29. System.out.println(s);
  30. };
  31. c2.accept("如果没有邪恶的话我们怎么会知道人世间的那些善良呢?");
  32. }
  33. //语法格式五:Lambda需要两个或以上的参数,多条执行语句,并且可以有返回值
  34. @Test
  35. public void test6(){
  36. Comparator<Integer> c1 = new Comparator<Integer>() {
  37. @Override
  38. public int compare(Integer o1, Integer o2) {
  39. System.out.println(o1);
  40. System.out.println(o2);
  41. return o1.compareTo(o2);
  42. }
  43. };
  44. System.out.println(c1.compare(15,23));
  45. System.out.println("\\\\\\\\\\\\\\\\\\\\\\\\\\");
  46. Comparator<Integer> com2 = (o1,o2) -> {
  47. System.out.println(o1);
  48. System.out.println(o2);
  49. return o1.compareTo(o2);
  50. };
  51. System.out.println(com2.compare(16,8));
  52. }
  53. //语法格式六:当Lambda体只有一条语句时,return与大括号若有,都可以省略
  54. @Test
  55. public void test7(){
  56. Comparator<Integer> c1 = (o1,o2) -> {
  57. return o1.compareTo(o2);
  58. };
  59. System.out.println(c1.compare(16,8));
  60. System.out.println("\\\\\\\\\\\\\\\\\\\\\\\\\\");
  61. Comparator<Integer> c2 = (o1,o2) -> o1.compareTo(o2);
  62. System.out.println(c2.compare(17,24));
  63. }
  64. @Test
  65. public void test8(){
  66. Consumer<String> c1 = s -> {
  67. System.out.println(s);
  68. };
  69. c1.accept("先天人性无善恶,后天人性有善恶。");
  70. System.out.println("---------------------");
  71. Consumer<String> c2 = s -> System.out.println(s);
  72. c2.accept("如果没有邪恶的话我们怎么会知道人世间的那些善良呢?");
  73. }
  74. }

总结

  1. ->左边:lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只有一个参数,其一对()也可以省略
  2. ->右边:lambda体应该使用一对{}包裹;如果lambda体只有一条执行语句(可能是return语句),省略这一对{}和return关键字