在一个已经存在的编程语言里非常少有对现有的生态系统起重大影响的新特性。Lambda表达式对于Java语言就是这样的意义的存在。简单来说,Lambda表达式提供了便利的方式去创建一个匿名的功能。提供了一个简单的方式使用表达式或一系列的状态创建一个简单方法。Lambda表达式是包括一个抽象方法的接口。Lamdba表达式能够用来创建简单的匿名功能来实现对集合元素的排序和过滤,还能分配变量并传递到其它对象中。等等。以下将结合样例来加深大家对Lamdba的理解。
首先讲一下安装配置 要想使用Lamdba,须要安装jdk1.8 你能够到官网下载 至于环境变量配置 參考本人其它的博客 or baidu|google.
(鉴于本人是小菜鸟所以使用IDE而非记事本),Eclipse 版本号 为 kepler 能够搜索eclipse kepler 下载
以上两步都完毕 启动Eclipse 安装eclipse支持编译java8的插件
安装完成重新启动后 開始lamdba之旅 ^_^
先来一个简单的样例
新建项目 java8 包名 java.lamdba
废话少说 上代码
001
public class HelloLambda { public interface HelloType{ void hello(String text); } public static void main(String[] args) { HelloType helloLambda = (String text) -> {System.out.println("Hello " + text);}; helloLambda.hello("Lambda"); } }
一个lamdba表达式是一个匿名的代码块封装了一个表达式或一系列状态并返回一个值。lamdba表达式也类似于其它语言中的闭包的概念。它接受零或多个參数[下面类似皆用num[+...]形式表示]。每一个參数能够显式指定类型也能够不显式指定类型[假设不指定类型java会自己主动从上下文中判断类型]。
如上所看到的,一个lamdba表达式包括了一个參数列表,一个java原来没有的字符 ‘->’ 以及一个以大括号包围起来的方法体。
(argument list) -> { body }
对一个lamdba表达式,參数列表能够包括0+个參数。假设没有參数,那么仅仅使用一对空的括号。假设仅仅有1个參数,能够不必使用括号。每一个參数的类型指定都是可选的。假设没有指定类型,则从上下文中判断。body里假设有1+行,用大括号包围起来。
执行上面的程序。会看到期望的输出 。
001 定义了一个接口 接口声明了一个方法 Main里写了接口的lamdba实现 依据 ( argument list ) -> {body} ; 传递一个參数 声明或不声明类型 ( text ) 方法体里打印"Hello" + text;然后调用hello并传值 结果打印 Hello Lamdba。
上代码 002
public class ActionCodeExample { interface ActionCode{ int returnCode(String codestr); } public static void main(String[] args) { /** * A lambda expression can contain any statement that an ordinary Java * method contains. However, the continue and break keywords are illegal * at the top level. */ ActionCode code = (codestr) -> { switch (codestr) { case "ACTIVE": return 0; case "INACTIVE": return 1; default: return -1; } }; System.out.println(code.returnCode("ACTIVE")); } }
002 中方法返回了一个int值,该接口方法接收一个字符串 依据switch这个字符串处理结果返回int,本例Lamdba封装了方法体的功能。
写一些自己定义的接口然后用Lamdba表达式来实现。全部的Lamdba表达式都实现了一个功能接口[仅仅有一个抽象方法的接口]。
上代码003
public class ReverseTypeExample { interface ReverseType { String reverse(String text); } public static void main(String[] args) { ReverseType newText = (testText) -> { String tempStr = ""; for (String part : testText.split(" ")) { tempStr = new StringBuilder(part).reverse().toString(); } return tempStr; }; System.out.println(newText.reverse("HELLO")); } }
003中功能接口包括了一个抽象方法的定义String reverse(String text),Main使用lamdba表达式实现了ReverseType,然后打印出返回值 OLLEH 。
除了使用上述方法外,我们还能使用在java.util.function包下的类去实现lamdba表达式,004将用Function<T,R>接口完毕003一样的功能。上代码004:
import java.util.function.Function; public class FunctionExample { public static void main(String[] args) { /** * accepts a string argument and returns a string result */ Function<String, String> newText = (testText) -> { String tempStr = ""; for(String part : testText.split(" ")){ tempStr = new StringBuilder(part).reverse().toString(); } return tempStr; }; System.out.println(newText.apply("WORLD")); } }
注意到我们导入了包java.util.function.Function;格式为Function<arugent list,return result>,Function为泛型:左边为接收的參数类型,右边为返回类型。并通过 apply() 来调用。004打印出DLROW。
看了这些样例,可能会想到假设每须要一种功能,就要自己写实现。java为我们预提供了非常多功能如图所看到的
使用java.util.function包下的的功能接口能够极大的降低你要编写的代码,并提高代码的性能。
下篇文章我们将使用lamdba表达式讲一下简单的排序,本篇就到这了。
ps:本文演示样例引自 Josh Juneau所著 Java 8 Recipes, 2nd Edition
mission completed!
O(∩_∩)O~