Java8新特性之Lambda表达式

举报
lwq1228 发表于 2021/10/30 13:48:27 2021/10/30
【摘要】 一、为什么使用Lambda 表达式Lambda 是一个匿名函数, 我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递) 。 可以写出更简洁、 更灵活的代码。 作为一种更紧凑的代码风格, 使Java的语言表达能力得到了提升。 二、Lambda 表达式 2.1、从匿名类到 Lambda 的转换1、举例1-多线程:(1)不使用Lambda时实现方式// 匿名内部类...

一、为什么使用Lambda 表达式

Lambda 是一个匿名函数, 我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递) 。 可以写出更简洁、 更灵活的代码。 作为一种更紧凑的代码风格, 使Java的语言表达能力得到了提升。

二、Lambda 表达式

2.1、从匿名类到 Lambda 的转换

1、举例1-多线程:

(1)不使用Lambda时实现方式

// 匿名内部类
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello World!!!");
    }
};

(2)使用Lambda时实现方式

// Lambda表达式
Runnable runnable = () -> System.out.println("Hello World!!!");

2、举例2-定制排序:

(1)不使用Lambda时实现方式

// 原来使用匿名内部类作为参数传递
TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return Integer.compare(o1.length(), o2.length());
    }
});

(2)使用Lambda时实现方式

// Lambda表达式直接作为参数传递
TreeSet<String> treeSet = new TreeSet<>((o1, o2) -> Integer.compare(o1.length(), o2.length()));

2.2、Lambda 表达式语法

Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。 这个操作符为->, 该操作符被称为 Lambda 操作符或箭头操作符,它将 Lambda 分为两个部分:

  • 左侧:指定了 Lambda 表达式需要的所有参数
  • 右侧:指定了 Lambda 体, 即 Lambda 表达式要执行的功能

1、语法格式一

Lambda表达式无参数, 无返回值, Lambda体只有一条执行语句。

Runnable runnable = () -> System.out.println("Hello World!!!");

2、语法格式二

Lambda表达式有一个参数,无返回值,Lambda体只有一条语句。

Consumer<String> consumer = (String param) -> System.out.println(param);

3、语法格式三

Lambda表达式参数的数据类型可以省略, 因为可由编译器推断得出,称为“类型推断” ,”语法格式二“参数去掉类型后简写如下。

Consumer<String> consumer = (param) -> System.out.println(param);

4、语法格式四

Lambda表达式只有一个参数时,参数的小括号可以省略,该格式属于“语法格式三”的进一步简写形式。

Consumer<String> consumer = param -> System.out.println(param);

5、语法格式五

Lambda表达式有多个参数,有返回值,并且 Lambda 体中有多条语句。

BinaryOperator<Long> binaryOperator = (x, y) -> {
    System.out.println("实现函数式接口方法!");
    return x + y;
};

6、语法格式六

当 Lambda 体只有一条语句时, return 与大括号可以省略。

BinaryOperator<Long> binaryOperator = (x, y) -> x + y;

三、类型推断

上述”语法格式三“之后的Lambda 表达式中的参数都省略了参数类型,这是因为其参数类型都是可以由编译器推断得出的。Lambda 表达式中无需指定类型, 程序依然可以编译, 这是因为 javac 根据程序的上下文, 在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境, 是由编译器推断出来的,这就是所谓的 “类型推断” 。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。