java8新特性之lambda

一、什么是lambda

在函数编程中,我们经常将方法作为参数来传递,这样不仅结构清晰而且更容易去组织一个良好的代码结构。例如Javascript写法:

<script type="text/javascript">    
    var test = function(callback) {
        // 通过函数引用调用传入函数
        callback("callback")
    }
    // 调用test()并传入函数实现
    test(function(message) {
        console.log(message)
    })
</script>

我们看到,在调用test(callback)方法的时候传入了一个functioncallback则是该function的函数引用,那么在test(callback)方法内部就可以通过callback这个函数引用来调用传入的function实现

上面示例,通过JavaScript的写法简单演示了一个函数引用传递的写法。那么Java能够实现这样的写法呢?

在JDK1.8之前,我们只能够通过如匿名内部类的方式去实现,示例如下:

public class OldWay {

    public static void main(String[] args) {
        doSth(new Callback() {
            @Override
            public void call() {
                System.out.println("匿名内部类的方式");
            }
        });
    }
    
    static void doSth(Callback callback) {
        callback.call();
    }
    
    interface Callback {
        void call();
    }
}

匿名内部类可以模拟实现如JavaScript类似的函数引用传递,不过在JDK1.8以后我们可以不用这么麻烦,因为1.8开始直接提供实现函数引用地写法,也就是说你也可以在Java中通过一个函数引用来传递和调用函数,即是Java的lambda。

二、lambda的示例

我们知道了lambda其实就是支持将函数通过引用来传递和控制的写法实现,那么具体该如何去使用呢,直接来看一个示例:

public class LambdaTest {

    public static void main(String[] args) {
        Callback callback = (message) -> {
            System.out.println("the message is: " + message);
        };
        callback.call("hello lambda");
    }

    interface Callback {
        void call(String message);
    }
}

首先我们定义了一个接口Callback,其中包含一个方法call(String message)。

在main函数中 “ = ”号左边即是引用,右边的 “(message)” 表示方法对应的参数 “-> {} ” 中包着一块输出文本信息的代码,也就是Callback接口声明的call(String message)对应的具体实现。 

接下来我们通过引用callback,调用其具体的函数call(String message)

下面我们简单改写一下,将函数作为参数进行传递

public class LambdaTest {

    public static void main(String[] args) {
        Callback callback = (message) -> {
            System.out.println("the message is: " + message);
        };
//        callback.call("hello lambda");
        test(callback);
    }

    static void test(Callback callback) {
        callback.call("hello lambda");
    }

    interface Callback {
        void call(String message);
    }
}

可以看到,在test方法中函数的具体实现可以被作为参数传递。lambda让Java支持将函数作为参数传递进其它方法当中使用。

三、lambda的写法

我们可以将lambda的写法固定理解为如下写法:

(参数) -> {具体代码实现};

1、如果是一个参数的话可以不用加 "()"

参数 -> {具体代码实现}

2、如果具体代码实现只有一行语句,也可以不用加 "{}"

参数 -> 具体代码实现

3、如果具体代码中只有一个函数返回值的表达式,如:

参数 -> return 返回值

可以不用显示声明return,也会自动返回

参数 -> 返回值

但是如果具体代码被 “{}”包裹,那么必须加上 “return”。

四、总结

lambda是Java8的新特性之一,它将函数式编程的写法引入的Java这样面向对象的语言当中。而lambda的主要作用就是实现函数引用的传递,以获取更加灵活的实现。当然,Java8很多特性将会和lambda组合使用。

猜你喜欢

转载自www.cnblogs.com/lay2017/p/9575743.html