• 小函数:Lambda表达式(Java篇)


    Lambda表达式的使用场景:用以简化接口实现。

    关于接口实现,可以有很多种方式来实现。例如:设计接口的实现类、使用匿名内部类。 但是lambda表达式,比这两种方式都简单!

    lambda表达式毕竟只是⼀个匿名方法。当实现的接口中的方法过多或者多少的时候,lambda表达式都是不适用的。lambda表达式,只能实现函数式接口。

    什么是函数式接口?

    如果说,一个有且仅有一个抽象方法的接口。这样的接口,就是函数式接口。(这个接口可以具有多个非抽象方法)

    @FunctionalInterface

    这个注解用在接口之前,判断这个接口是否是⼀个函数式接口。 如果是函数式接口,没有任何问题。如果不是函数式接口,则会报错。

    冷知识: 

    @Override

    这个注解解用于表示一个方法是覆盖(override)父类中的方法。这个注解告诉编译器,这个方法应该覆盖了父类中的方法。如果父类中没有这个方法或者子类中的方法与父类中的方法签名不一致,编译器就会报错。

    使用@Override注解的好处是,它可以让我们在编译时检查是否正确地覆盖了父类中的方法,避免了运行时错误。同时,它也可以提高代码的可读性和可维护性,因为我们可以清楚地知道这个方法是在覆盖父类中的方法。

    1. @FunctionalInterface
    2. public interface UserService {
    3. public void eat(String a,int b);
    4. }

    Lambda表达式的语法 

    lambda表达式就是⼀个匿名函数。因此在写lambda表达式的时候,不需要关心方法名是什么 !

    实际上,我们在写lambda表达式的时候,也不需要关心返回值类型! 

    1. (parameters) -> { statements; }
    2. //这里,参数是函数方法的参数列表,可以是零个或多个。
    3. //箭头"->"将参数列表与表达式或语句块分开。如果表达式是唯一的,那么可以省略大括号。
    4. //如果存在多个语句,那么需要使用大括号来包围它们。

    如果接口中定义的方法有返回值,则在实现的时候,注意返回值的返回! 

    1. public class Main {
    2. public static void main(String[] args) {
    3. //无参
    4. UserService userService = (a,b) ->{
    5. System.out.println(a+b+"岁了!");
    6. };
    7. userService.eat("Tom",18);//Tom18岁了!
    8. }
    9. }

    进阶 

    参数的精简 

    由于在接口的方法中,已经定义了每⼀个参数的类型是什么。而且在使用lambda表达式实现接口的时候,必须要保证参数的数量和类 型需要和接口中的方法保持⼀致。因此,此时lambda表达式中的参数的类型可以省略不写!

    不要有的写类型,有的不写类型!!! 

    参数的小括号

    如果方法的参数列表中的参数数量 有且只有⼀个,此时,参数列表的小括号是可以省略不写的。

     

    1. //一个参数
    2. Test test = name -> {
    3. System.out.println(name+"test");
    4. };
    5. test.test("小新");

    方法体部分的精简

    方法体⼤括号的精简。

    1. Test test = name -> System.out.println(name+"test");
    2. test.test("小新");

    当⼀个方法体中的逻辑,有且只有⼀句的情况下,⼤括号可以省略

    return的精简

    如果⼀个方法中唯⼀的⼀条语句是⼀个返回语句, 此时在省略掉大括号的同时, 也必须省略掉return

    Test test = (a,b) -> a+b;
    

    函数的引用

    lambda表达式是为了简化接口的实现的。在lambda表达式中,不应该出现比较复杂的逻辑。如果在lambda表达式中出现了过于复杂的逻辑,会对程序的可读性造成非常大的影响。如果在lambda表达式中需要处理的逻辑比较复杂,⼀般情况会单独的写⼀个方法。在lambda表达式中直接引用这个方法即可。
    函数引用:引用⼀个已经存在的方法,使其替代lambda表达式完成接口的实现

    静态方法的引用

    语法:类::静态方法

    注意事项:

    • 在引用的方法后面,不要添加小括号。
    • 引用的这个方法,参数(数量、类型)和返回值,必须要跟接口中定义的⼀致
    1. /**
    2. * @author: Mercury
    3. * Date: 2022/3/20
    4. * Time: 18:17
    5. * Description:lambda表达式静态方法引用
    6. * Version:1.0
    7. */
    8. public class Main {
    9. public static void main(String[] args) {
    10. //实现多个参数,一个返回值的接口
    11. //对一个静态方法的引用,语法:类::静态方法
    12. Test1 test1 = Calculator::calculate;
    13. System.out.println(test1.test(4,5));
    14. }
    15. }
    16. class Calculator{
    17. public static int calculate(int a,int b ){
    18. // 稍微复杂的逻辑:计算a和b的差值的绝对值
    19. if (a > b) {
    20. return a - b;
    21. }
    22. return b - a;
    23. }
    24. }
    25. interface Test1{
    26. int test(int a,int b);
    27. }

    非静态方法的引用

    语法:对象::非静态方法

    注意事项:

    • 在引用的方法后⾯,不要添加小括号。
    • 引用的这个方法, 参数(数量、类型) 和 返回值, 必须要跟接口中定义的⼀致。
    1. /**
    2. * @author: Mercury
    3. * Date: 2022/3/21
    4. * Time: 8:14
    5. * Description:lambda表达式对非静态方法的引用
    6. * Version:1.0
    7. */
    8. public class test {
    9. public static void main(String[] args) {
    10. //对非静态方法的引用,需要使用对象来完成
    11. Calculator calulator=new Calculator();
    12. Test2 test2 = calulator::calculate;
    13. System.out.println(test2.calculate(2, 3));
    14. }
    15. private static class Calculator{
    16. public int calculate(int a, int b) {
    17. return a > b ? a - b : b - a;
    18. }
    19. }
    20. }
    21. interface Test2{
    22. int calculate(int a,int b);
    23. }

     

  • 相关阅读:
    【408数据结构与算法】—快速排序(十九)
    ArcGIS 10.5安装教程!
    laravel框架介绍(二) 打开站点:autoload.php报错
    【编程题】【Scratch四级】2019.12 打棒球
    工程机械比例阀电流采集方案
    MES系统是什么——史上最全MES介绍
    404和路由钩子
    c—线性表
    (react+ts)vite项目中的路径别名的配置
    双向不带头链表 —— Java(附有源码)
  • 原文地址:https://blog.csdn.net/m0_62407354/article/details/134407531