• Lambda 表达式详解


    Lambda
    LAMBDA

    ⚪ λ 希腊字母表中排序第十一位的字母, 英语名称为Lambda

    ⚪ 避免匿名内部类定义过多

    ⚪ 其实质属于函数式编程的概念

    ⚪ 也可称为闭包

    ⚪ Lambda允许把一个函数作为方法的参数(函数作为参数传递进方法中)。

    Lambda是在jdk8之后出现的所以现在用到的还是比较多的, 需要学习

    ◻️ 为什么要使用Lambda表达式 

       ◽避免匿名内部类定义过多

       ◽可以使代码更加简洁紧凑

       ◽去掉了一堆没有意义的代码, 只留下核心的逻辑。

    💬 也许你会说, 我看了Lambda表达式, 不但不觉得简洁, 反而觉得更乱了, 看不懂了. 那是因为我们还没有习惯, 用的多了, 看习惯了, 就好了。学习就是这样的一个过程

    语法

    lambda 表达式的语法格式如下:

    1. (parameters) -> expression [表达式]
    2. (parameters) -> statement [语句]
    3. (parameters) -> { statements; }
    a-> System.out.println("i like lambda-->"+a)
    

    ◻️ 理解Functional Interface (函数式接口) 是学习Java8 lambda表达式的关键所在。

     函数式接口定义:

       ◽任何接口, 如果只包含唯一一个抽象方法, 那么它就是一个函数式接口。

    1. public interface Runnable {
    2. public abstract void run(); //抽象方法
    3. }

       ◽对于函数式接口, 我们可以通过 Lambda表达式 来创建该接口的对象。

    如果到这里某些小伙伴还是听不懂的话, 没关系, 我们上代码推动着你讲解一下你就懂了:

    Lambda表达式推导

    1. 首先需要定义一个函数式接口

    2. 实现接口的方法 → 一步一步简化方式实现

    •      第一个实现方法  :创建实现类, 实现
    •      第二个实现方法  :静态内部类, 实现
    •      第三个实现方法  :局部内部类, 实现
    •      第四个实现方法  :匿名内部类, 实现
    •      第五个实现方法  :Lambda表达式, 实现

    3. 创建接口对象  接口调用实现类

    1. package cn.lambda;
    2. /**
    3. * @BelongsProject: staticthread
    4. * @BelongsPackage: cn.lambda
    5. * @Author: Jean_z
    6. * @CreateTime: 2024-05-14 10:52
    7. * @Description: TODO: 推导 Lambda表达式
    8. * @Version: 1.0
    9. */
    10. public class TestLambda {
    11. // 3. 静态内部类
    12. static class Like2 implements ILike{
    13. @Override
    14. public void lambda() {
    15. System.out.println("i like lambda2");
    16. }
    17. }
    18. // 3. main
    19. public static void main(String[] args) {
    20. // 3. 创建接口对象 接口调用实现类
    21. ILike like = new Like();
    22. like.lambda();
    23. like = new Like2();
    24. like.lambda();
    25. // 4. 局部内部类
    26. class Like3 implements ILike {
    27. @Override
    28. public void lambda() {
    29. System.out.println("i like lambda3");
    30. }
    31. }
    32. like = new Like3();
    33. like.lambda();
    34. // 5. 匿名内部类, 没有类的名称,必须借助接口或者父类
    35. like = new Like() {
    36. @Override
    37. public void lambda() {
    38. System.out.println("i like lambda4");
    39. }
    40. };
    41. like.lambda();
    42. // 6. 用Lambda简化 Lambda是在jdk8之后出现的所以现在用到的还是比较多的, 需要学习
    43. like = ()-> {
    44. System.out.println("i like lambda5");
    45. };
    46. like.lambda();
    47. }
    48. }
    49. //1. 首先需要定义一个函数式接口
    50. interface ILike {
    51. void lambda();
    52. }
    53. //2. 实现类, 实现lambda方法
    54. class Like implements ILike {
    55. @Override
    56. public void lambda() {
    57. System.out.println("i like lambda");
    58. }
    59. }

    如果你还是不理解那我们再来写一个例子

     我们可以看到我们以上代码定义的函数式接口是没有参数的, 那我们来写一个不同的例子, 带参数的函数式接口.

    这次我们一个方式一个方式的写, 看着不会太乱, 更好理解

    Lambda表达式推导详解

    这里我们定义了一个int类型的参数

    1. 定义一个带参数的函数接口 

    2. 实现接口方法

    3. 创建接口对象  接口调用实现类

    4. 传递参数

    • 第一个实现方法  :创建实现类, 实现

    1. package cn.lambda;
    2. /**
    3. * @BelongsProject: staticthread
    4. * @BelongsPackage: cn.lambda
    5. * @Author: Jean_z
    6. * @CreateTime: 2024-05-14 12:11
    7. * @Description: TODO
    8. * @Version: 1.0
    9. */
    10. public class TestLambda2 {
    11. public static void main(String[] args) {
    12. // 创建接口对象
    13. ILove love = new Love();
    14. // 传递参数
    15. love.love(2);
    16. }
    17. }
    18. // 1. 定义一个带参数的函数式接口
    19. interface ILove {
    20. void love(int a); //定义一个int类型的参数
    21. }
    22. //2. 实现类
    23. class Love implements ILove {
    24. @Override
    25. public void love(int a) {
    26. System.out.println("i love you--->" + a);
    27. }
    28. }

    •      第二个实现方法  :静态内部类, 实现 

    1. package cn.lambda;
    2. /**
    3. * @BelongsProject: staticthread
    4. * @BelongsPackage: cn.lambda
    5. * @Author: Jean_z
    6. * @CreateTime: 2024-05-14 12:11
    7. * @Description: TODO
    8. * @Version: 1.0
    9. */
    10. public class TestLambda2 {
    11. //2. 静态实现类
    12. static class Love implements ILove {
    13. @Override
    14. public void love(int a) {
    15. System.out.println("i love you--->" + a);
    16. }
    17. public static void main(String[] args) {
    18. // 实现love接口
    19. ILove love = new Love();
    20. // 传递参数
    21. love.love(2);
    22. }
    23. }
    24. }
    25. // 1. 定义一个带参数的函数式接口
    26. interface ILove {
    27. void love(int a); //定义一个int类型的参数
    28. }

    •      第三个实现方法  :局部内部类, 实现

    1. package cn.lambda;
    2. /**
    3. * @BelongsProject: staticthread
    4. * @BelongsPackage: cn.lambda
    5. * @Author: Jean_z
    6. * @CreateTime: 2024-05-14 12:11
    7. * @Description: TODO
    8. * @Version: 1.0
    9. */
    10. public class TestLambda2 {
    11. public static void main(String[] args) {
    12. //2. 局部内部类
    13. class Love implements ILove {
    14. @Override
    15. public void love(int a) {
    16. System.out.println("i love you--->" + a);
    17. }
    18. }
    19. // 实现love接口
    20. ILove love = new Love();
    21. // 传递参数
    22. love.love(2);
    23. }
    24. }
    25. // 1. 定义一个带参数的函数式接口
    26. interface ILove {
    27. void love(int a); //定义一个int类型的参数
    28. }

         

    • 第四个实现方法  :匿名内部类, 实现

    1. package cn.lambda;
    2. /**
    3. * @BelongsProject: staticthread
    4. * @BelongsPackage: cn.lambda
    5. * @Author: Jean_z
    6. * @CreateTime: 2024-05-14 12:11
    7. * @Description: TODO
    8. * @Version: 1.0
    9. */
    10. public class TestLambda2 {
    11. public static void main(String[] args) {
    12. // 实现love接口
    13. // 匿名内部类
    14. ILove love = new ILove(){
    15. @Override
    16. public void love(int a) {
    17. }
    18. };
    19. // 传递参数
    20. love.love(2);
    21. }
    22. }
    23. // 1. 定义一个带参数的函数式接口
    24. interface ILove {
    25. void love(int a); //定义一个int类型的参数
    26. }

    匿名内部实现类推导再简化, 就是我们的Lambda表达式.

    •       第五个实现方法  :Lambda表达式, 实现

    如下图:

    基于匿名内部类代码小编圈起来的代码都不用要了直接删掉!

    • 只留下我们的参数和主体  就是我们的lambda表达式了

    参数: int a;

    主体: System.out.println()

    1. package cn.lambda;
    2. /**
    3. * @BelongsProject: staticthread
    4. * @BelongsPackage: cn.lambda
    5. * @Author: Jean_z
    6. * @CreateTime: 2024-05-14 12:11
    7. * @Description: TODO
    8. * @Version: 1.0
    9. */
    10. public class TestLambda2 {
    11. public static void main(String[] args) {
    12. // 实现love接口
    13. // lambda表达式实现
    14. ILove love = (int a)-> {
    15. System.out.println("i love lambda表达式");
    16. };
    17. // 传递参数
    18. love.love(2);
    19. }
    20. }
    21. // 1. 定义一个带参数的函数式接口
    22. interface ILove {
    23. void love(int a); //定义一个int类型的参数
    24. }

    那有些小伙伴就要问了:

    💬 :既然可以简化这么多, 我们还能不能对它再简化呢?

    👩‍💻:没问题

    而且小编给大家扩充一下, Lambda表达式可以实现3种简化.但是也有条件的

    简化 Lambda表达式

    • 简化方式一:

    1. 简化掉参数类型

    1. package cn.lambda;
    2. /**
    3. * @BelongsProject: staticthread
    4. * @BelongsPackage: cn.lambda
    5. * @Author: Jean_z
    6. * @CreateTime: 2024-05-14 12:11
    7. * @Description: TODO
    8. * @Version: 1.0
    9. */
    10. public class TestLambda2 {
    11. public static void main(String[] args) {
    12. // 实现love接口
    13. ILove love=null;
    14. // lambda表达式实现
    15. love = (int a)-> {
    16. System.out.println("i love lambda表达式");
    17. };
    18. // Lambda表达式简化 1, 参数类型
    19. love = (a)-> {
    20. System.out.println("i love lambda表达式");
    21. };
    22. // 传递参数
    23. love.love(2);
    24. }
    25. }
    26. // 1. 定义一个带参数的函数式接口
    27. interface ILove {
    28. void love(int a); //定义一个int类型的参数
    29. }

    •  简化方式二:

    2. 简化掉参数类型+括号

    前提:

    只有一个参数的情况下才可以去掉括号, 多个参数会报错. 加上括号即可

    1. package cn.lambda;
    2. /**
    3. * @BelongsProject: staticthread
    4. * @BelongsPackage: cn.lambda
    5. * @Author: Jean_z
    6. * @CreateTime: 2024-05-14 12:11
    7. * @Description: TODO
    8. * @Version: 1.0
    9. */
    10. public class TestLambda2 {
    11. public static void main(String[] args) {
    12. // 实现love接口
    13. ILove love=null;
    14. // lambda表达式实现
    15. love = (int a)-> {
    16. System.out.println("i love lambda表达式");
    17. };
    18. // Lambda表达式简化 1, 参数类型
    19. love = (a)-> {
    20. System.out.println("i love lambda表达式");
    21. };
    22. // Lambda表达式简化 2, 简化括号
    23. love = a-> {
    24. System.out.println("i love lambda表达式");
    25. };
    26. // 传递参数
    27. love.love(2);
    28. }
    29. }
    30. // 1. 定义一个带参数的函数式接口
    31. interface ILove {
    32. void love(int a); //定义一个int类型的参数
    33. }

    •   简化方式三:

    2. 简化掉参数类型+括号+花括号

    前提:

    只有一行代码的情况下

    多个参数不能使用, 会报错 多个参数需要加上括号

    1. package cn.lambda;
    2. /**
    3. * @BelongsProject: staticthread
    4. * @BelongsPackage: cn.lambda
    5. * @Author: Jean_z
    6. * @CreateTime: 2024-05-14 12:11
    7. * @Description: TODO
    8. * @Version: 1.0
    9. */
    10. public class TestLambda2 {
    11. public static void main(String[] args) {
    12. // 实现love接口
    13. ILove love=null;
    14. // lambda表达式实现
    15. love = (int a)-> {
    16. System.out.println("i love lambda表达式");
    17. };
    18. // Lambda表达式简化 1, 参数类型
    19. love = (a)-> {
    20. System.out.println("i love lambda表达式");
    21. };
    22. // Lambda表达式简化 2, 简化括号
    23. love = a-> {
    24. System.out.println("i love lambda表达式");
    25. };
    26. // Lambda表达式简化 3, 简化花括号
    27. love = a-> System.out.println("i love lambda表达式" + a);
    28. // 传递参数
    29. love.love(2);
    30. }
    31. }
    32. // 1. 定义一个带参数的函数式接口
    33. interface ILove {
    34. void love(int a); //定义一个int类型的参数
    35. }

    总结:

    lambda表达式只能有一行代码的情况下才能简化成为一行, 如果有多行, 那就么就用代码块包裹.

    前提是接口为函数时接口.

    多个参数也可以去掉参数类型, 要去掉就全去掉, 必须加括号

  • 相关阅读:
    ArrayList、LinkedList、Collections.singletonList、Arrays.asList与ImmutableList.of
    基于SSM 离退休管理平台-计算机毕设 附源码 52629
    【强化学习】Sarsa算法求解悬崖行走问题 + Python代码实战
    【Arduino+ESP32专题】串口的简单使用
    CentOS7 k3s安装与配置
    vue常用修饰符-- stop,prevent,.enter,once,lazy,number,trim
    工具、技巧【个人专用】如何在CSND编辑器内输出带颜色的字体?Markdown编辑器——字体、字号、颜色使用全解
    Layui之动态树
    ESP32编译出现Cannot establish a connection to the component registry.报错
    Codeforces Round #712 (Div. 1) A. Balance the Bits
  • 原文地址:https://blog.csdn.net/zzx_mn/article/details/138843255