java8新特性之lambda
Posted lay2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java8新特性之lambda相关的知识,希望对你有一定的参考价值。
一、什么是lambda
在函数编程中,我们经常将方法作为参数来传递,这样不仅结构清晰而且更容易去组织一个良好的代码结构。例如javascript写法:
<script type="text/javascript"> var test = function(callback) { // 通过函数引用调用传入函数 callback("callback") } // 调用test()并传入函数实现 test(function(message) { console.log(message) }) </script>
我们看到,在调用test(callback)方法的时候传入了一个function,callback则是该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组合使用。
以上是关于java8新特性之lambda的主要内容,如果未能解决你的问题,请参考以下文章