Java 8 新特性-菜鸟教程 (1) -Java 8 Lambda 表达式

时间:2022-09-23 18:30:41

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

语法

lambda 表达式的语法格式如下:

(parameters) -> expression

(parameters) ->{ statements; }

以下是lambda表达式的重要特征:

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

Lambda 表达式实例

在 Java8Tester2.java 文件输入以下代码:

package java8.cainiao;

public class Java8Tester2 {
public static void main(String args[]){
Java8Tester2 tester = new Java8Tester2(); // 类型声明
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");
} private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
} interface MathOperation {
int operation(int a, int b);
} interface GreetingService {
void sayMessage(String message);
}

执行以上脚本,输出结果为:

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Runoob
Hello Google

使用 Lambda 表达式需要注意以下两点:

  • Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
  • Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

变量作用域

lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

在 Java8Tester3.java 文件输入以下代码:

package java8.cainiao;

public class Java8Tester3 {

       final static String salutation = "Hello! ";

       public static void main(String args[]){
GreetingService greetService1 = message ->
System.out.println(salutation + message); greetService1.sayMessage("Runoob");
} interface GreetingService {
void sayMessage(String message);
}
}

执行以上脚本,输出结果为

Hello! Runoob

1.lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)

Java 8 新特性-菜鸟教程 (1) -Java 8 Lambda 表达式

编译报错:The final field Java8Tester3.salutation cannot be assigned

2.在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。

String first = "";
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //编译会出错

Java 8 新特性-菜鸟教程 (1) -Java 8 Lambda 表达式的更多相关文章

  1. Java 8 新特性-菜鸟教程 &lpar;0&rpar; -Java 8 新特性

    Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 ...

  2. Java 8 新特性-菜鸟教程 &lpar;7&rpar; -Java 8 Nashorn JavaScript

    Java 8 Nashorn JavaScript Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java ...

  3. Java 8 新特性-菜鸟教程 &lpar;3&rpar; -Java 8 函数式接口

    Java 8 函数式接口 函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为lambda表达式. 函数式接 ...

  4. Java 8 新特性-菜鸟教程 &lpar;4&rpar; -Java 8 默认方法

    Java 8 默认方法 Java 8 新增了接口的默认方法. 简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法. 我们只需在方法名前面加个default关键字即可实现默认方法. 为 ...

  5. Java 8 新特性-菜鸟教程 &lpar;8&rpar; -Java 8 日期时间 API

    Java 8 日期时间 API Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理. 在旧版的 Java 中,日期时间 API 存在诸多问题,其中有: ...

  6. Java 8 新特性-菜鸟教程 &lpar;5&rpar; -Java 8 Stream

    Java 8 Stream Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种 ...

  7. Java 8 新特性-菜鸟教程 &lpar;6&rpar; -Java 8 Optional 类

    Java 8 Optional 类 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容 ...

  8. Java 8 新特性-菜鸟教程 &lpar;2&rpar; -Java 8 方法引用

    Java 8 方法引用 方法引用通过方法的名字来指向一个方法. 方法引用可以使语言的构造更紧凑简洁,减少冗余代码. 方法引用使用一对冒号 :: . 下面,我们在 Car 类中定义了 4 个方法作为例子 ...

  9. Java 8 新特性-菜鸟教程 &lpar;9&rpar; -Java8 Base64

    Java8 Base64 在Java 8中,Base64编码已经成为Java类库的标准. Java 8 内置了 Base64 编码的编码器和解码器. Base64工具类提供了一套静态方法获取下面三种B ...

随机推荐

  1. TensorFlow白皮书

    TensorFlow [1] is an interface for expressing machine learning algorithms, and an implementation for ...

  2. ACE - Reactor模式源码剖析及具体实现(大量源码慎入)

    原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于 ...

  3. WordPress无法连接MySQL数据库

    安装WordPress,需要配置MySQL数据库.配置好用户名和密码后居然还是报错. 通过抓包软件,发现根本没有数据包发往3306端口. 只能google之,发现是因为selinux的原因 解决方案: ...

  4. webservice axis2客户端设置代理方法&lpar;公司网络通过代理访问时)

    webservice axis2客户端设置代理方法(公司网络通过代理访问时)   UploadProcessInServiceStub stub = new UploadProcessInServic ...

  5. listview滑动

    单击其中的一个item时,让这个item能滚动的listview的顶部.现在用 list.scrollTo(0, item.getTop()); 实现啦 android listview滚动到顶部 转 ...

  6. 切换Allegro PCB Editor

    操作系统:Windows 10 x64 工具1:Allegro PCB Editor 菜单File > Change Editor... 在Product Choices对话框中,就可以选择想要 ...

  7. Dada&lowbar;WenJian

    import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWr ...

  8. YII2中actions的作用与使用

    我们常在控制器中看到一个actions的方法,这个方法具体的作用是共用一些功能相同的action,方便调用. 当然我们也可以自已写一些action来进行调用.在项目目录下创建common目录,并创建T ...

  9. rsync:重要的安全参数

    ---------------------------------------------------------------------------------------------------- ...

  10. 获取form表单元素值的4种方式

    <html><head><title></title><script type="text/javascript"> f ...