本文配套教学视频:B站观看地址

在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂。本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应该都掌握了,实际上还是存在大量的程序员没有使用java8,还有的使用了java8也不会使用lambda表达式。

Lambda表达式是Java 8最流行最常用的功能特性。它将函数式编程概念引入Java,函数式编程的好处在于可以帮助我们节省大量的代码,非常方便易用,能够大幅度的提高我们的编码效率。在本文中,我们将介绍lambda表达式是什么,并将传统的java代码写法转换为lambda表达式写法,大家可以通过示例了解lambda表达式都对传统代码做了哪些简化。

本文配套教学视频:B站观看地址

一、接口定义

首先,我们要明白lambda表达式在表达什么?答案就是lambda表达式表达接口函数的实现,所以我们有必要做一下准备工作。在传统的开发方式下,我们不习惯将代码块传递给函数。我们所有的行为定义代码都封装在方法体内,并通过对象引用执行,就像使用下面的代码一样:

public class LambdaDemo {//函数定义public void printSomething(String something) {System.out.println(something);}//通过创建对象调用函数public static void main(String[] args) {LambdaDemo demo = new LambdaDemo();String something = "I am learning Lambda";demo.printSomething(something);}
}

大家应该对上面的代码的开发方式不感到陌生,这是经典OOP的实现样式。下面我们对上面的代码做一个修改,创建一个功能接口,并对该接口定义抽象方法。

public class LambdaDemo {//抽象功能接口interface Printer {void print(String val);}//通过参数传递功能接口public void printSomething(String something, Printer printer) {printer.print(something);}
}

本文配套教学视频:B站观看地址

二、传统的接口函数实现方式

在上述实现中,Printer接口负责打印行为,可以是控制台打印,也可以是其他的打印行为。方法printSomething不再定义行为,而是执行Printer定义的行为,这样的设计更加灵活。代码如下:

public static void main(String[] args) {LambdaDemo demo = new LambdaDemo();String something = "I am using a Functional interface";//实现Printer接口Printer printer = new Printer() {@Overridepublic void print(String val) {//控制台打印System.out.println(val);}};demo.printSomething(something, printer);
}

至此我们都尚未使用lambda表达式。我们仅创建了Printer接口的具体实现,并将其传递给printSomething方法。

三、lambda表示式实现方式

关于lambda表达式概念后文再说,我们先来学习一下lambda表达式的语法:

(param1,param2,param3 ...,paramN)-  > {   //代码块;  }

  • 首先我们知道lambda表达式,表达的是接口函数
  • 箭头左侧是函数的逗号分隔的形式参数列表
  • 箭头右侧是函数体代码

现在,我们使用lambda表达式重构一下第一小节中的代码

public static void main(String[] args) {LambdaDemo demo = new LambdaDemo();String something = "I am learning Lambda";//实现Printer接口(请关注下面这行lambda表达式代码)Printer printer = (String toPrint)->{System.out.println(toPrint);};//调用接口打印demo.printSomething(something, printer);
}

lambda表达式使我们代码更简洁。实际上使用lambda表达式在性能和多核处理还有更多的好处,但是只有在理解java8 Streams API之后它们才有意义,因此不在本文讨论范围之内(本号之前的文章都有介绍)。

对比传统java代码的实现方式,代码量是不是减少了很多?但这仍然不是最简的实现方式,我们一步一步来。

Printer printer = (String toPrint)->{System.out.println(toPrint);};
//简化:去掉参数类型
Printer printer = (toPrint)->{System.out.println(toPrint);};
//简化:去掉参数括号
Printer printer = toPrint->{System.out.println(toPrint);};
//简化:去掉函数体花括号
Printer printer = toPrint->System.out.println(toPrint);

  • 即使没有在箭头的左侧指定参数的类型,编译器也会从接口方法的形式参数中推断出其类型
  • 当只有一个参数的时候,我们完全可以省略参数的括号
  • 当函数体只有一行的时候,我们完全可以省略函数体花括号

如果我们的接口方法定义不带任何参数,则可以用空括号替换:

()->  System.out.println("anything you wan to print")

那么,我们最终通过lambda表达式,简化完成的代码是什么样的呢?庐山真面目:

public static void main(String[] args) {LambdaDemo demo = new LambdaDemo();String something="I am Lambda";//关注下面的这行代码demo.printSomething(something, toPrint -> System.out.println(toPrint));
}

我们使用lambda表达式内联为函数调用参数,将最初main方法的9行代码下降到只有3行。但笔者要说,这仍然不是lambda表达式可以完成的最终极代码简化方式,当你学习了java8 Stream API结合lambda表达式使用,你会发现你的编码效率将大幅度提高!

结论

lambda表达式表达的是接口函数,箭头左侧是函数参数,箭头右侧是函数体。函数的参数类型和返回值类型都可以省略,程序会根据接口定义的上下文自动确定数据类型。

在这篇文章中,我们对Java中的Lambda表达式进行了详尽的介绍,并了解了如何使用它们来提高接口实现效率和质量。请关注本号更多有关内容,Stream API与Collections框架一起使用时为Lambda提供了更多优势。

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

  • 《手摸手教你学Spring Boot2.0》
  • 《Spring Security-JWT-OAuth2一本通》
  • 《实战前后端分离RBAC权限管理系统》
  • 《实战SpringCloud微服务从青铜到王者》
  • 《VUE深入浅出系列》

java lambda表达式_恕我直言你可能真的不会java第1篇:lambda表达式会用了么?相关推荐

  1. java stream流_恕我直言你可能真的不会java第4篇:Stream管道流Map操作

    一.回顾Stream管道流map的基础用法 最简单的需求:将集合中的每一个字符串,全部转换成大写! List<String> alpha = Arrays.asList("Mon ...

  2. java 与sql设置排序方法是_恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合...

    在开始之前,我先卖个关子提一个问题:我们现在有一个Employee员工类. @Data @AllArgsConstructor public class Employee { private Inte ...

  3. list按照某个字段排序_恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合

    在开始之前,我先卖个关子提一个问题:我们现在有一个Employee员工类. @Data @AllArgsConstructor public class Employee {private Integ ...

  4. java transient关键字_嗯?你真的会用 Java 序列化机制?

    码农每日一题长按关注,工作日每天分享一个技术知识点. 一.序列化.反序列化概念及其使用场景 1.序列化.反序列化的概念 简单的讲,序列化就是将java对象转化成二进制保存到磁盘中去,反序列化就是从磁盘 ...

  5. java hashmap用法_备战金九银十:Java核心技术面试题100+,助你搞定面试官

    一线互联网公司工作了几年,我作为求职者参加了不少面试,也作为面试官面试了很多同学,整理这份面试指南,一方面是帮助大家更好的准备面试,有的放矢,另一方面也是对自己知识框架做一个体系化的梳理. 这篇文章梳 ...

  6. java 浮点数运算_对于同样的浮点数运算为何 Java 与 C 的结果不相同?

    @bombless 在问题的评论里写得没错.IEEE 754最重要的(大家基本上遵守的)是数据的格式.虽然也有算法上的指引(例如有各种rounding mode),但实际上大家实现得不一定那么严格. ...

  7. 怎样才算高级Java开发工程师_怎样才能成为一名高级java软件工程师?

    从低级java程序员专注java技术路线发展,可以成为一个令人敬仰的高级java工程师,当然java高级工程师也不是那么容易练就的,java程序员该朝哪些方向努力向高级java工程师发展?怎样成为一个 ...

  8. java 清空控制台_利用原生库和JNI(Java原生接口)实现H2数据库漏洞利用

    在H2数据库引擎中获取代码执行权限的技术早已是众所周知,但有个要求就是H2能够动态编译Java代码.而本文将向大家展示以前没有公开过的利用H2的方法,并且无需使用Java编译器,即通过原生库和JNI( ...

  9. java框架核心技术_你必须掌握的 21 个 Java 核心技术!(干货)

    点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 51闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘 ...

最新文章

  1. Ubuntu 16.04 64位安装arm-linux-gcc交叉编译器以及samba服务器
  2. JSON C# Class Generator ---由json字符串生成C#实体类的工具
  3. 父页面监听iframe路由变化_前端路由原理
  4. 杭电1716排列2 stl
  5. 310. 最小高度树
  6. Python3+Selenium3+Unittest+ddt+Requests 接口自动化测试框架
  7. C# Explicit 和 Implicit
  8. 搜索引擎网页排序算法
  9. php ini set开启方法,php ini_set更改php.ini配置功能_PHP教程
  10. 软件项目中的成本构成及估算方法【转】
  11. 基于C#实现卫星坐标计算与单点定位
  12. 织梦建站教程dedecms标签调用大全【经典教程】
  13. odi12配置mysql_Oracle Data Integrator 12c 安装(ODI安装)
  14. 干货满满!解密阿里云RPA (机器人流程自动化)的产品架构和商业化发展
  15. 深入浅出理解Java并发AQS的共享锁模式
  16. wps excel批量获取网址标题(Title)
  17. 2021年备战面试--算法13
  18. CRMEB 打通版4.3
  19. 基于springboot的高校办公室会议行政事务管理系统(mysql)-JAVA.VUE【数据库设计、论文、源码、开题报告】
  20. HTML5仿五子棋游戏源码

热门文章

  1. 软件需求阅读笔记之三
  2. [蘑菇街] 搜索、算法团队招募牛人啦-年底了走过路过不要错过 - V2EX
  3. 全新的基于VVC思想的页面验证js框架vtor
  4. python之变量操作
  5. mockcpp的so加载失败问题
  6. IT编辑推荐:广通Broadview IT运维管理平台
  7. 单例模式 之 单例模式——懒汉模式
  8. Python分布式爬虫-elasticsearch搭建搜索引擎
  9. FineUI利用JS取控件的值
  10. sql中like带参数的写法