1. 首页
  2. java8教程

006-六、Java 8 Lambda 表达式 ( 上 )- 简介

引言

Lambda 表达式在 Java 8 中引入,并且被吹捧为 Java 8 最大的特性。

Lambda 表达式是函数式编程的的一个重要特性,标志者 Java 向函数式编程迈出了重要的第一步。

Java Lambda 表达式语法

Java Lambda 表达式的语法结构如下


parameter -> expression body

实际代码可能如下

有参数且只有一条语句时


(a,b) -> a + b

只有一个参数时


a -> a

没有参数时


() -> System.out.println("研发军团")

有多条语句时


(a,b) -> { int c = a + b; System.out.println("研发军团") }

针对这个 Java Lambda 表达式语法,有几个重要的特征需要说明

  1. 可选的参数类型声明 : 无需声明参数的类型。编译器可以从参数的值推断出相同的值。
  2. 可选的参数周围的小括号 () : 如果只有一个参数,可以忽略参数周围的小括号。但如果有多个参数,则必须添加小括号。
  3. 可选的大括号 {} : 如果 Lambda 表达式只包含一条语句,那么可以省略大括号。但如果有多条语句,则必须添加大括号。
  4. 可选的 return 关键字 : 如果 Lambda 表达式只有一条语句,那么编译器会自动 return 该语句最后的结果。但如果显式使用了 return 语句,则必须添加大括号 {},哪怕只有一条语句。

Java Lambda 表达式的原理

后面我们会讲到,Java 8 中的 Lambda 表达式其实是一个特殊的只有一个方法的类的实例。

这些类是 Java 8 内部已经定义好的,而且实现了 java.lang.FunctionalInterface 这个接口。

这个 java.lang.FunctionalInterface 接口是一种信息性注解类型,用于标识一个接口类型声明为函数接口( functional interface )。

从某些方面说,Java 8Lambda 表达式是使用匿名内部类的语法创建了 java.util.function 包下相应签名的接口的或者其它自定义的只有一个方法的接口实例。

但是,实际上,Java 8 中的 Lambda 不仅仅是使用匿名内部类,还使用了 Java 8 接口的默认方法和一些其它的功能。这方面,有空我会写一篇文章。

范例一: Java Lambda 表达式

Lambda 比较常见的使用场景就是 new Runnable 匿名内部类的使用

LambdaTester.java


public class LambdaTester { public static void main(String[] args) { Runnable r = () -> System.out.println("你好,研发军团,你好,教程 "); Thread th = new Thread(r); th.start(); } } 运行结果如下 [penglei@tech.souyunku.com helloworld]$ javac LambdaTester.java && java LambdaTester 你好,研发军团,你好,教程

范例二

LambdaTester.java


public class LambdaTester { public static void main(String args[]) { LambdaTester tester = new LambdaTester(); // 有声明参数类型 MathOperation addition = (int a, int b) -> a + b; // 没有声明参数类型 MathOperation subtraction = (a, b) -> a - b; // 使用 return 语句显式返回值需要添加大括号 MathOperation multiplication = (int a, int b) -> { return a * b; }; // 如果只有一条语句,那么可以省略大括号,Java 会返回表达式的值 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)); } interface MathOperation { int operation(int a, int b); } private int operate(int a, int b, MathOperation mathOperation) { return mathOperation.operation(a, b); } } //运行结果如下 [penglei@tech.souyunku.com helloworld]$ javac LambdaTester.java && java LambdaTester + 5 = 15 - 5 = 5 x 5 = 50 / 5 = 2

Java Lambda 表达式的缺点

不知道大家有没有从上面的表达式中看到一些端倪,好像,好像 Java 8 中的 Lambda 不能凭空出现。

Java Lambda 表达式最大的缺点,就是不能像其它语言的 Lambda 表达式一样凭空出现。

Java 中的 Lambda 表达式需要有一个函数接口声明作为模板。这个模板定义了 Lambda 表达式的参数类型和返回值类型。

例如下面的代码,我们先要声明一个函数接口类型,然后才能定义一个参数和返回值都一样的表达式

LambdaTester.java


public class LambdaTester { // 先声明一个函数接口 interface GreetingService { void sayMessage(String message); } public static void main(String args[]) { LambdaTester tester = new LambdaTester(); // 有小括号 GreetingService greetService1 = message -> System.out.println("你好," + message); // 省略小括号 GreetingService greetService2 = (message) -> System.out.println("你好," + message); greetService1.sayMessage("研发军团"); greetService2.sayMessage("教程 "); } } //运行结果如下 [penglei@tech.souyunku.com helloworld]$ javac LambdaTester.java && java LambdaTester 你好,研发军团 你好,教程

写完了如果写得有什么问题,希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:006-六、Java 8 Lambda 表达式 ( 上 )- 简介

    链接:https://www.javajike.com/article/1398.html

« 007-七、Java 8 Lambda 表达式 ( 中 )- 外部参数
004-四、Java8 Runnable Lambda 表达式»

相关推荐

QR code