Lambda 表达式

Lambda 表达式

1. 为何需要 Lambda 表达式

  • 在 Java 中, 我们无法发将函数作为参数传递给一个方法,也无法声明返回一个函数的方法
  • 在 JavaScript 中,函数参数是一个函数,返回值是另一个函数的情况是非常常见的;JavaScript 是一门非常经典的函数式语言

2. Lambda 表达式作用

  • Lambda 表达式为 Java 添加了缺失的函数式编程特性,使我们能将函数当作一等公民看待
  • 在将函数作为一等公民的语言中,Lambda 表达式的类型是函数。但在 Java 中,Lambda 表达式是对象,他们必须依附于一类特别的对象类型 -- 函数式接口

3. Java Lambda 概要

Java Lambda 表达式是一种匿名函数;它是没有声明的方法,即没有访问修饰符、返回值声明和名字。

4. Lambda 表达式作用

传递行为,而不仅仅是值。

  • 提升抽象层次
  • API 重用性更好
  • 更加灵活

5. Java Lamdba 基本语法

Java 中的 Lambda 表达式基本语法(左边是参数,右边是匿名函数的具体实现

(argument) -> {body}

比如说

  • (arg1, arg2...) -> {body}
  • (type1 arg1, type2 arg2...) -> {body}

6. Java Lambda 示例

Lambda 示例说明

// 参数为 a,b ,返回 a+b
(int a, int b) -> {return a + b;}

// 无参数,打印 Hello World
() -> System.out.println("Hello World");

// 参数为 s,打印 s 值
(String s) -> {System.out.println(s);}

// 无参数,返回 42
() -> 42

// 无参数,返回 3.14
() -> {return 3.14}

8. Java Lambda 结构

  • 当只有一个参数,且其类型可推导时,圆括号 () 可省略。例如:a -> {return a*a}

lambda 的类型是由上下文信息来断定的 // lambda 的类型就是 String String s1 = () -> {};

  • Lambda 表达式的主体可包含零条或多条语句
  • 如果 Lambda 表达式的主体只有一条语句,花括号 {} 可省略,并且有 return 返回值的要去掉 return 。匿名函数的返回类型与该主体表达式一致
  • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号 {} 中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空。

大例子

一个完整的例子:遍历 list

外部迭代
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
for (int number: numbers) {
    System.out.println(number);
}
内部迭代
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach(new Consumer<Integer>(){
    public void accept(Integer value) {
        System.out.println(value);
    }
})
使用 Lambda 表达式
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach(Integer value) -> System.out.println(value);
更近一步
List<Integer> number = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.forEach(value -> System.out.println(value));

forEach 接口是函数式接口。

方法引用
List<Integer> number = Arrays.asList(1, 2, 3, 4, 5, 6);
// method reference
numbers.forEach(System.out::println);

通过方法引用的方式创建函数式接口的实例。

外部迭代和内部迭代区别: 外部迭代需要一个迭代器对象,内部迭代List本身就可以完成。

PS:

发现用 compareTo 方法结合 lambda 表达式来进行数组反转实在是太好用了,哈哈哈:

List<String> list = Arrays.asList("zhangsan", "lisi", "wangwu", "zhaoliu");
// 匿名内部类
Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        return o2.compareTo(o1);
    }
});

// lambda 表达式
Collections.sort(list, (o1, o2) -> o2.compareTo(o1));

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一些杂想(服务器篇)

    希希里之海
  • Django 项目重命名

      在日常学习工作过程中,我们难免需要复用以前的项目,这里讲下复用 Django 项目并重命名的过程。

    希希里之海
  • spring 学习(二)spring bean 管理--配置文件和注解混合使用

    相似的,创建 maven 工程,配置pom.xml 文件,具体可以参考上一篇博文:

    希希里之海
  • 【DB笔试面试456】Oracle常用替换函数有哪两个?

    Oracle常用替换函数有两个,分别是REPLACE和TRANSLATE函数。REPLACE与TRANSLATE都是替代函数,只不过REPLACE针对的是字符串...

    小麦苗DBA宝典
  • 沃尔玛新计划:在其位于纽约的一家门店内建造AI实验室

    沃尔玛宣布其最新计划,在其位于纽约Levittown的一家门店内推出其所谓的智能零售实验室。

    AiTechYun
  • 送书|5分钟技术实操: 手把手教你开发以太坊钱包

    钱包服务将允许用户生成独一无二的种子,显示地址和相关余额,最后将允许用户发送以太币给其他账户。所有操作都在客户端上进行,这样比较容易取得用户的信任。用户必须记住...

    区块链大本营
  • 我常用的iOS开源库

    OC库和Swift库相似功能的很多 选择的建议是:如果OC库在Swift中完全能用 就优先用OC库 原因是:Swift语言还是不太稳定 语言一更新 程序一大改 ...

    剑行者
  • 利用spf有效防止域名被邮箱伪造

    你可以尝试运用这个网站测试发送一封邮件给你本人。例如:检测说a.com存在邮件伪造的漏洞。那么我们能够尝试运用admin@a.com作为发件人,给一个本人的邮箱...

    周俊辉
  • 11g dataguard使用总结(r5笔记第12天)

    11g的dataguard相比于10g来说,最优越的特性应该算就是active dataguard了,这一点改进在很大意义上促使用户需要把数据库从10g升级到1...

    jeanron100
  • Windows服务的快速搭建与调试(C#图解)

    目录 一、什么是Windows 服务? 二、创建Windows 服务与安装/卸载批处理。 三、调试Windows 服务。 正文 一、什么是Windows ...

    Java中文社群_老王

扫码关注云+社区

领取腾讯云代金券