重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
; Java 终于要支持Lambda表达式!自 年以来Lambda表达式已经在Lambda项目中被支持 在那时候 Lambda表达式仍被称为Java闭包 在我们进入一些代码示例以前 先来解释下为什么Lambda表达式在Java程序员中广受欢迎 为什么使用Lambda表达式 Lambda表达式通常使用在图形用户界面(GUI)的开发中 一般来说 GUI编程将程序行为和事件做连接 比如 当用户按下一个按钮(触发一个事件) 你的程序就需要去执行某些行为 可能是将一些数据储存到一个数据存储器中 在Swing中 可以使用ActionListener来实现 class ButtonHandler implements ActionListener { public void actionPerformed(ActionEvent e) { //do something } } class UIBuilder { public UIBuilder() { button addActionListener(new ButtonHandler()) } } 这个例子表明了 ButtonHandler 类作为一个回调替换的用法 在这里 ButtonHandler 类仅包含 ActionListener 接口定义的 actionPerformed 方法 我们可以使用匿名内部类来简化代码 class UIBuilder { public UIBuilder() { button addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { //do something } }) } } 这样代码简洁多了 更仔细的去看代码时 就会发现我们还创建一个只生成一个实例的类 而这个实例也仅仅持有一个独立的方法 这恰好是Lambda表达式所能解决的其中一类问题 Lambda表达式代替函数 一个lambda表达式从字面上讲就是一个函数 它定义了一个函数的输入参数和函数体 Java 中的 lambda表达式语法尚未确定 不过大致应该类似这个样子的 (type parameter) function_body 一个具体的例子 (String s String s ) s length() s length() 这个lambda表达式用来计算两个字符串的长度差 还有一些扩展的语法 比如避免参数的类型定义(我们马上见看到例子)还有使用{和}来支持多行定义 Collections sort() 方法是lambda表达的理想例子 它允许我们将字符串按照长度排序 ListString list = Array asList( loooooong short tiny ) Collections sort(list (String s String s ) s length() s length()) tiny short loooooong 所以 不像现在java必须要求的向sort方法输入一个已经实现的Comparator(比较器)而是传送一个lambda表达式我们就可以得到相同的结果 Lambda表达式代替闭包 lambda表达式有许多有趣的特性 其中之一是 它们是闭包 一个闭包允许函数访问直接词法作用域之外的变量 String outer = java (String s ) s length() outer length() 在例子中 lambda表达式访问了字符串 outer 这个作用域之外定义的变量 对于内联闭包来说这是很难做到的 Lambda表达式也支持类型推论 类型推论是java 引入的但它同样适用于lambda表达式 简单来说 类型推论意味着程序员可以在任意一个编译器能够自动推断出类型的地方省略类型定义 如果类型推论能够应用到前面的排序lambda表达式上 那么它就能写成下面的样子 ListString list = Arrays asList(…) Collections sort(list (s s ) s length() s length()) 就像你所见到的一样 参数s 和s 的类型被省略了 因为编译器知道list是一个字符串集合 它知道被用来作为比较器的lambda表达式必定是相同的类型 因此 这个类型不需要显式地声明 即使你有这么做的自由 类型推论的主要优势就是减少样板代码 如果编译器可以为我们识别类型 为什么我们必须自己定义它们 珍爱Lambda表达式 远离匿名内部类 我们来体会下 为何lambda表达式和类型推论有助于简化我们前面所提到的回调例子 class UIBuilder { public UIBuilder() { button addActionListener(e //process ActionEvent e) } } 我们下载直接传送一个lambda表达式进入 addActionListener 方法来代替前面定义的持有回调方法的类 除了减少模板代码和提高可读性以外 它使我们直接表达我们唯一感兴趣的事情 处理事件 在我们了解lambda表达式更多优势之前 先来看看在Scala中的lambda表达式副本 Scala中的Lambda表达式 在函数式编程中 函数是基本的构造块 Scala融合了java中的面向对象编程和函数式编程 在Scala中 一个lambda表达式是种叫做 函数 或者 函数文本 Scala中的函数属于一等公民 它们可以被分配给vals或者vars(最终变量或者非最终变量) 它们可以作为其他函数的参数 也可以组合成新的函数 在Scala中一个函数文本写成如下形式 (argument) = //funtion body 举例来说 前面提到的java 用来计算两个字符串长度差的 lambda 表达式 在Scala中写作如下 (s : String s :String) = s length s length Scala中的函数文本也是闭包 它可以访问在直接词法作用域之外定义的变量 val outer = val myFuncLiteral = (y: Int) = y * outer val result = myFuncLiteral( ) 这个例子结果是 正如你所见 我们将函数文本分配给了变量 myFuncLiteral java 的lambda表达式和Scala的函数文本在语法和语义上的相似性是十分明显的 从语义上讲它们是相同的 而语法上的唯一不同就是箭头符号(java scala =)和我们没有提到的简化符号 lishixinzhi/Article/program/Java/hx/201311/27132
庆阳ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
java的lambda表达式是什么?下面就一起来了解一下吧~
Lambda 表达式被熟称为:闭包,是推动 Java 8 发布的一个新特性,使用 Lambda 表达式可以使代码变的更加简洁紧凑。
语法
lambda 表达式的语法格式如下:
(parameters) - expression或(parameters) -{ statements; }以下是lambda表达式的重要特征:
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
Lambda 表达式实例
Lambda 表达式的简单例子: // 1. 不需要参数,返回值为 5 () - 5 // 2. 接收一个参数(数字类型),返回其2倍的值 x - 2 * x // 3. 接受2个参数(数字),并返回他们的差值 (x, y) - x – y // 4. 接收2个int型整数,返回他们的和 (int x, int y) - x + y // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void) (String s) - System.out.print(s)
在 Java8Tester.java 文件输入以下代码:
Java8Tester.java 文件 public class Java8Tester { public static void main(String args[]){ Java8Tester tester = new Java8Tester(); // 类型声明 MathOperation addition = (int a, int b) - a + b; // 不用类型声明 MathOperation subtraction = (a, b) - a - b; // 大括号中的返回语句 MathOperation multiplication = (int a, int b) - { return a * b; }; // 没有大括号及返回语句 MathOperation division = (int a, int b) - a / b; System.out.println("10 + 5 = " + tester.operate(10, 5, addition)); System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction)); System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication)); System.out.println("10 / 5 = " + tester.operate(10, 5, division)); // 不用括号 GreetingService greetService1 = message - System.out.println("Hello " + message); // 用括号 GreetingService greetService2 = (message) - System.out.println("Hello " + message); greetService1.sayMessage("Runoob"); greetService2.sayMessage("Google"); } interface MathOperation { int operation(int a, int b); } interface GreetingService { void sayMessage(String message); } private int operate(int a, int b, MathOperation mathOperation){ return mathOperation.operation(a, b); }}
执行以上脚本,输出结果为:
$ javac Java8Tester.java $ java Java8Tester10 + 5 = 1510 - 5 = 510 x 5 = 5010 / 5 = 2Hello RunoobHello Google
使用 Lambda 表达式需要注意以下两点:
Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。
lambda表达式是JAVA8中提供的一种新的特性,它支持JAVA也能进行简单的“函数式编程”。它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。
函数式接口:
这个是理解Lambda表达式的重点,也是产生lambda表达式的“母体”,这里我们引用一个比较容易理解的说法:函数式接口是 一个只有一个抽象方法(不包含object中的方法)的接口。
这个需要说明一点,就是在Java中任何一个对象都来自Object 所有接口中自然会继承自Object中的方法,但在判断是否是函数式接口的时候要排除Object中的方法。