什么是Lambda表达式
简述
Lambda表达式是JAVA8中提供的一种新的特性,是一个匿名函数方法。可以把Lambda表达式理解为一段可以传递的代码,可以写出更简洁、更灵活的代码。
Lambda表达式的优点
简洁:无需像匿名内部类那样写大量模板代码,直接把方法体的实现写进去即可。
灵活:Lambda可以作为参数和返回值进行传递,赋值给函数式接口。
可推导:可以根据上下文推导出参数和返回值的类型,不需要显式声明。
惰性:只有调用了该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()
汇总
函数式接口就是仅包含一个抽象方法的接口。
使用 @FunctionalInterface 注解进行修饰,明确其角色。
函数式接口的抽象方法形式称为函数描述符。
可以包含默认方法和静态方法。
描述符参数列表和返回值相同不构成重复。
可以继承自其他接口。
函数式接口的实现可以通过 Lambda 表达式简洁地表示。
常用的函数式接口:Consumer、Supplier、Function、Predicate 等。
可以用方法引用直接引用现有方法实现函数式接口。
在许多场景下可用函数式接口替代匿名内部类。
作为方法的参数和返回值传递 Lambda 实现。
扩展了 Java 对函数式编程的支持。
但不应滥用函数式接口,应与面向对象编程结合使用。
Java 中函数式接口的定义让 Lambda 表达式有了使用场景。
使语言表达更灵活,代码更简洁。
总结起来,函数式接口和 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中方式的对比,可以看到从繁琐到简单的一个过程,每一种都在上一种的基础上进行演化。演化到一种相对简单的形式,供用户使用。