Java8 Lambda表达式

1 函数式接口

函数式接口:只有一个抽象方法的接口
学习Lambda表达式之前必须要先了解下函数式接口,Runnable是一个很老的接口,它符合函数式接口的定义,
在Java8中Runnable接口被添加了用以标注函数式接口的@FunctionalInterface注解:
这里写图片描述
Lambda表达式与函数式接口的关系:Lambda表达式就是函数式接口中抽象方法的实现
Lambda表达式入参类型对应函数式接口中抽象方法入参类型
Lambda表达式返回类型对应函数式接口中抽象方法返回类型
也就是说在使用Lambda表达式之前必须要有一个与之对应的函数式接口的存在!
当一个方法的入参是某个函数式接口时,你就可以使用lambda表达式:

//启一个线程,入参为一个Runnable接口实现类
//() -> System.out.println("Thread is running...")实现Runnable接口的run()方法
new Thread(
        () -> System.out.println("Thread is running...")
).start();

Java 8添加一个新的包”java.util.function”,定义了一些用于lambda表达式的消费型、供给型、函数型和断言型函数式接口。
函数式接口 –>点击跳转

2 Lambda表达式作用

2.1 使代码变的更加简洁紧凑
当我们实现一个接口时(如Runnable接口),因为语法定义,不得不创建一个实现类,或者一个匿名类,如下:

new Thread(new Runnable(){
    @Override
    public void run(){
        System.out.println("Thread is running...");
    }
}).start();

使用Lambda表达式在一定程度上解决了这个问题,如下:

new Thread(
        () -> System.out.println("Thread is running...")
).start();

如上所示,Lambda表达式一个常见的用法是取代(某些)匿名内部类,但Lambda表达式的作用不限于此;

2.2 把函数作为参数进行传递
把它作为参数传递,这样我们在实现不同逻辑的时候,只需要改动lambda表达式就可以,而不需要重新写一个方法了;
先定义一个函数式接口:

interface FuncInterface {
   // 只有一个抽象方法
   int calculate(int x,int y);
}

main方法调用:

     public static void main(String[] args) {
        // 使用lamdba表达式
        // 调用下边定义的invoke方法,把lamdba表达式作为参数传递
        int invokeResult1 = invoke(((x, y) -> {
            return x + y;
        }), 8, 2);
        int invokeResult2 = invoke(((x, y) -> {
            return x * y;
        }), 8, 2);
        int invokeResult3 = invoke(((x, y) -> {
            return x % y;
        }), 8, 2);
        System.out.println("invokeResult1: " + invokeResult1);
        System.out.println("invokeResult2: " + invokeResult2);
        System.out.println("invokeResult3: " + invokeResult3);
    // 定义一个方法调用函数式接口中的calculate方法
    public static  int invoke(FuncInterface func,int a,int b) {
        return func.calculate(a,b);
    }

执行结果:

invokeResult1: 10
invokeResult2: 16
invokeResult3: 0
3 Lambda表达式语法

这里写图片描述
遵循如下格式:expression = (variable) -> action
1) 入参:用(int a)表示,类型也可以省去,jdk会自行判断

// 没有参数
() -> { System.out.println("No argument"); }
// 一个参数
(int i) -> { System.out.println("Single integer argument : " + i); }
// 多个参数
( int x, String y ) -> { System.out.println("Two arguments : " + x + " and " + y); }

2) Lambda表达式的操作符:箭头->
3) body体
主体可以是一个表达式或语句块;
如果body只包含单一表达式,将执行表达式并返回:

() -> System.out.println("No argument");

如果body中逻辑比较复杂,则需要用{}括起来,那么与正常的方法一样,语句块执行后将返回给调用者:

        // lamdba表达式引用main()方法中的局部变量param
        // param需要是一个final型的,已经确定了的值而且不能再改变
        int param = 100;
        int invokeResult4 = invoke(((x, y) -> {
            return x + y + param;
        }), 8, 2);
        //param再次赋值,编译会报错
        //param = 200;
        System.out.println("invokeResult4: " + invokeResult4);

注意:lamdba表达式内引用的外部变量需为final的,不能再次进行赋值

4 Lambda表达式的用处

1) 替代匿名类简化代码
2) 作为参数传递增强灵活性
3) 结合stream对集合进行串行或并行的聚合操作

涉及代码:–>GitHub


参考文献:
[ 1 ]Java8函数式编程/(英)Richard Warburton著;王群锋译。–北京:人民邮电出版社,2015-03-01.
[ 2 ]http://www.importnew.com/26080.html
[ 3 ]http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html#section1
[ 4 ]http://java8.in/java-8-lambda-expression/
[ 5 ]https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
[ 6 ]https://winterbe.com/posts/2014/03/16/java-8-tutorial/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值