首页 > 技术文章 > Java Lambda表达式

shuangaaa 2021-01-28 19:07 原文

Lambda表达式简介:
Lambda表达式,也可称为闭包,Java8新特性。
Lambda允许将函数作为一个方法的参数(函数作为参数传递进方法中)。
使用Lambda表达式可以使代码更加简洁紧凑。
尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。

Lambda对接口的要求:
虽然使用Lambda表达式可以对某些接口进行简单实现,不是所有的接口都可以使用Lambda表达式来实现。
Lambda规定接口中只有一个必须需要被实现的方法,不是规定接口中只有一个接口。
被default修饰的方法会有默认实现,不是必须实现的方法,不影响Lambda表达式的使用。

@FunctionalInterface注解的作用:
专门用来修饰函数式接口,要求接口中抽象方法只有一个。这个注解一般会和Lambda表达式一起使用。

Lambda基础语法:
语法形式为() -> {},其中{}用来描述方法体,->为Lambda运算符,读作goes to。

最传统的接口使用方式:

/*
* Main.class
*/
public class Main {

    public static void main(String[] args) {
        ImpInter impInter = new ImpInter();
        impInter.method();
    }
}

class ImpInter implements NoReturnNoParam {
    @Override
    public void method() {
        System.out.println("没有返回值,也没有参数");
    }
}
/*
* NoReturnNoParam接口
*/
@FunctionalInterface
public interface NoReturnNoParam {

    //要求必须实现的抽象方法
    void method();

    default void mm(){}
}

比较传统的接口使用方式,匿名内部类:

/*
* Main.class
*/
public class Main {

    public static void main(String[] args) {
        NoReturnNoParam noReturnNoParam = new NoReturnNoParam() {
            @Override
            public void method() {
                System.out.println("没有返回值,也没有参数");
            }
        };
        noReturnNoParam.method();
    }
}

规范的Lambda表达式写法:

public class Main {

    public static void main(String[] args) {
        NoReturnNoParam noReturnNoParam = () -> {
            System.out.println("没有返回值,也没有参数");
        };
        noReturnNoParam.method();
    }
}

有参数和返回值的Lambda表达式写法:

/*
* Main.class
*/
public class Main {

    public static void main(String[] args) {
        //匿名内部类
        ReturnTwoParam returnTwoParam = new ReturnTwoParam() {
            @Override
            public int method(int a, int b) {
                System.out.println("param:"+a+"and"+b);
                return 1;
            }
        };
        returnTwoParam.method(1,2);
        
        //Lambda表达式
        ReturnTwoParam returnTwoParam1 = (int a,int b) -> {
            System.out.println("param:"+a+"and"+b);
            return 1;
        };
        int c = returnTwoParam1.method(3,4);
        System.out.println(c);
    }
}
/*
* ReturnTwoParam接口
*/
@FunctionalInterface
public interface ReturnTwoParam {
    int method(int a,int b);
}

简化Lambda表达式写法:

//1、简化参数类型,可以不写参数类型,但必须所有参数类型都不写
ReturnTwoParam returnTwoParam1 = (a,b) -> {
    System.out.println("param:"+a+"and"+b);
    return 1;
};
int c = returnTwoParam1.method(3,4);
System.out.println(c);

//2、简化参数小括号,如果只有一个参数,则可以省略参数小括号
ReturnOneParam returnOneParam1 = a -> {
    System.out.println("param:"+a);
    return 1;
};
int c = returnOneParam1.method(3);
System.out.println(c);

//3、简化方法体大括号,如果方法只有一条语句,则可以省略方法体大括号
NoReturnNoParam noReturnNoParam = () -> System.out.println("没有返回值,也没有参数");
noReturnNoParam.method();

//4、如果方法体只有一条语句,并且是return语句,则可以省略方法体大括号
ReturnOneParam returnOneParam = a -> a+4;
returnOneParam.method();

推荐阅读