0
点赞
收藏
分享

微信扫一扫

lambda表达式的进阶过程



文章目录

  • 什么是Lambda表达式
  • 简述
  • Lambda表达式的优点
  • 语法格式
  • 函数式接口
  • 定义
  • 常见的函数式接口
  • 汇总
  • Lambda的演化过程
  • lambda表达式简化
  • 总结


什么是Lambda表达式

简述

Lambda表达式是JAVA8中提供的一种新的特性,是一个匿名函数方法。可以把Lambda表达式理解为一段可以传递的代码,可以写出更简洁、更灵活的代码。

Lambda表达式的优点

  1. 简洁:无需像匿名内部类那样写大量模板代码,直接把方法体的实现写进去即可。
  2. 灵活:Lambda可以作为参数和返回值进行传递,赋值给函数式接口。
  3. 可推导:可以根据上下文推导出参数和返回值的类型,不需要显式声明。
  4. 惰性:只有调用了该lambda表达式,才会真正执行方法体中的代码。

语法格式

(parameters) -> expression

(parameters) ->{ statements; }

第一个为无返回值的语法,第二个为有返回值的语法。
使用lambda表达式可以写出非常简洁的函数式代码,经常用于集合迭代,事件处理等场景。

函数式接口

定义

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

interface ILove{
    void love(int a,String b);
}

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

常见的函数式接口

几个常见的函数式接口:

  • Runnable:抽象方法run()
  • Supplier:抽象方法get()
  • Consumer:抽象方法accept()
  • Function:抽象方法apply()
  • Predicate:抽象方法test()

汇总

  1. 函数式接口就是仅包含一个抽象方法的接口。
  2. 使用 @FunctionalInterface 注解进行修饰,明确其角色。
  3. 函数式接口的抽象方法形式称为函数描述符。
  4. 可以包含默认方法和静态方法。
  5. 描述符参数列表和返回值相同不构成重复。
  6. 可以继承自其他接口。
  7. 函数式接口的实现可以通过 Lambda 表达式简洁地表示。
  8. 常用的函数式接口:Consumer、Supplier、Function、Predicate 等。
  9. 可以用方法引用直接引用现有方法实现函数式接口。
  10. 在许多场景下可用函数式接口替代匿名内部类。
  11. 作为方法的参数和返回值传递 Lambda 实现。
  12. 扩展了 Java 对函数式编程的支持。
  13. 但不应滥用函数式接口,应与面向对象编程结合使用。
  14. Java 中函数式接口的定义让 Lambda 表达式有了使用场景。
  15. 使语言表达更灵活,代码更简洁。
    总结起来,函数式接口和 Lambda 表达式相辅相成,增强了 Java 的函数式编程能力,使代码更加简洁高效。但还需与面向对象编程结合使用,发挥各自优势。

Lambda的演化过程

描述:有一个接口,我们需要实现其方法。
方式一:普通方法,直接普通类实现,并重写方法

public class Testlambda {
    public static void main(String[] args) {
        ILove love=new Love();
        love.love(2);
    }


}

class Love implements ILove{

    @Override
    public void love(int a) {
        System.out.println("I Love You"+a);
    }
}

interface ILove{
    void love(int a);
}

方式二:静态内部类

public class Testlambda {
   static class Love implements ILove{

        @Override
        public void love(int a) {
            System.out.println("I Love You"+a);
        }
    }

    public static void main(String[] args) {
        ILove love=new Love();
        love.love(2);
    }

}

interface ILove{
    void love(int a);
}

方式三:局部内部类

public class Testlambda {


    public static void main(String[] args) {
        //局部内部类
        class Love implements ILove{

            @Override
            public void love(int a) {
                System.out.println("I Love You"+a);
            }
        }
        
        ILove love=new Love();
        love.love(2);
    }


}

interface ILove{
    void love(int a);
}

方式四:匿名内部类

public class Testlambda {


    public static void main(String[] args) {
        //匿名内部类
        ILove love=new ILove(){
            @Override
            public void love(int a) {
                System.out.println("I Love You"+a);
            }
        };
        love.love(2);
    }
    
}

interface ILove{
    void love(int a);
}

方式五:lambda表达式

public class Testlambda {


    public static void main(String[] args) {
        //lambda表达式
        ILove love=(int a)-> {
                System.out.println("I Love You"+a);
            };

        love.love(2);
    }

}

interface ILove{
    void love(int a);
}

通过以上5中方式的对比,可以看到从繁琐到简单的一个过程,每一种都在上一种的基础上进行演化。演化到一种相对简单的形式,供用户使用。

lambda表达式简化

未简化前:

lambda表达式的进阶过程_开发语言


简化一:去掉参数类型

public class Testlambda {


    public static void main(String[] args) {
        //lambda表达式
        ILove love;
        love=( a)-> {
            System.out.println("I Love You"+a);
        };
        love.love(2);
    }

}

interface ILove{
    void love(int a);
}

简化二:去掉括号

public class Testlambda {


    public static void main(String[] args) {
        //lambda表达式
        ILove love;
        love= a-> {
            System.out.println("I Love You"+a);
        };
        love.love(2);
    }

}

interface ILove{
    void love(int a);
}

简化3:去掉花括号,前提是花括号中只有一行

public class Testlambda {


    public static void main(String[] args) {
        //lambda表达式
        ILove love;
        love= a-> System.out.println("I Love You"+a);
        
        love.love(2);
    }

}

interface ILove{
    void love(int a);
}

注:

  1. lambda表达式只能由一行代码的情况,才能简化为一行,如果由都澳航那么就用代码块包裹
  2. 前提是接口为函数式接口
  3. 多个参数也可以去掉参数类型,要去掉,都去掉,不能带一个去一个

总结

  1. Lambda表达式实质上是一个可传递的匿名函数,可以实现函数式编程。
  2. 语法形式为:(参数列表) -> {代码体},去掉了方法名称、返回值声明等代码模板。
  3. Lambda通常用来传递给函数式接口的参数或赋值给函数式接口变量。
  4. 使用Lambda能避免创建匿名内部类,代码更简洁。
  5. Lambda可以访问外层作用域的变量,这称为闭包。
  6. Lambda表达了一个块的代码,也可以直接用于调用,称为代码块。
  7. Lambda可以延迟执行,只有被调用时才会执行。
  8. 常用的函数式接口如Consumer、Supplier、Function等。
  9. 可以用方法引用来直接引用已有的方法实现,更简洁。
  10. Lambda靠Java的类型推断来判断参数和返回类型。
  11. Lambda让Java加入了函数式编程的特性,可以写出更简洁、灵活的代码。
  12. 但也不能过度使用Lambda,需要区分应用场景,与面向对象编程结合使用。
    总之,Lambda表达式让Java语言表达能力更强,编程风格更灵活,对于集合、流、事件驱动等编程场景都很有用。但还是要适度使用,与面向对象编程结合,发挥它的优势。

lambda表达式的进阶过程_lambda表达式_02


举报

相关推荐

0 条评论