本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明。

Lambda 表达式怎么来的?

在Java 中, 给一个字符串变量赋值就很简单, 类似:
String str = "Hello World.";

  1. 函数的赋值
    如果要把一个函数赋值给一个变量怎么办呢?类似一般的变量赋值,
     blockOfCode = public void method(String s) {System.out.println(s);};
  1. 简化
    上面的代码看起来有点啰嗦, 通过以下几点进行简化:
  • public 多余,可以删除
  • 因为有变量名, 函数名也是多余, 可以删除
  • 返回类型由编译器自己判断, 可以删除
  • 参数类型也可以删除

通过简化,代码后:

blockOfCode   = (s){System.out.println(s);}
  1. 进一步简化和改善
    使用下面两点对上面的代码进一步简化和改善:
  • 如果只有一行, 省略大括号
  • 使用箭头符号连接参数和函数

改善后的代码如下:

blockOfCode   = (s) -> System.out.println(s);

这个代码是不是就很接近Lambda 表达式了?

Lambda 表达式的类型?

类似 (s) -> System.out.println(s) 的Lamba 表达式究竟是什么呢?
可以这样简单理解

  • Lamba 类型是一个接口
  • Lamba 表达式本身是一个接口的实现。

有个问题是: Lamba 表达式实现了一个接口方法, 如果这个接口定义了多个方法呢?
在Java中, 只有一个接口函数需要被实现的接口类型, 称做 “函数式接口”
为了避免在接口中增加接口函数, 变成非函数接口,Java提供了一个注解@FunctionalInterface , 注解该注解后, 就无法在该接口添加接口函数了。

Java Lambda表达式的使用场景

在Java中, Lambda 的使用场景有很多, 这里列举几种常见的使用场景。

1. 按钮事件处理

曾经C/S 模式流行的时候, Java的界面开发工具包(类似AWT、Swing、SWT等)很受欢迎, 在界面开发的时候,给一个组件(比如按钮)添加事件监听器的代码类似:

 @Testpublic void btnListener() {JButton btn = new JButton();btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("btnListener: without lambda expression");}});}
  • ActionListener 是一个接口, 该接口定义了一个方法actionPerformed()。
  • new ActionListener() { actionPerformed 方法实现} 语法用于定义一个匿名类并返回该类的实例。

因为ActionListener 接口只有一个需要实现的接口方法,所以可以使用Lambda表达式替代,代码如下:

btn.addActionListener((e) -> {System.out.println("btnListener: use lambda expression");});

完整示例:https://gitee.com/xuemingchen/java-ency/blob/master/src/main/java/com/osxm/je/base/lambda/AwtBtnListenerLambdaDemo.java

2.  实现Runnable 接口的线程

在Java中,创建一个线程可以使用 new Thread(Runnable target) , 该构造函数的参数是一个继承Runnable接口的匿名类实例, 该类实现接口的run() 方法, 代码如下:

     new Thread(new Runnable() {@Overridepublic void run() {System.out.println("runnable:without lambda expression");}}).start();

使用Lambda 表达式之后, 以上代码可以简化为:

new Thread(() -> System.out.println("runnable:use lambda expression")).start();

完整示例:https://gitee.com/xuemingchen/java-ency/blob/master/src/main/java/com/osxm/je/base/lambda/RunnableLambdaDemo.java

3. 列表(List)的遍历

在Java中, 对一个数组循环遍历的方式有很多种,比如有这样一个字符串数组:
List<String> list = Arrays.asList("str1","str2","str3");
对于早期的Java初学者最常用的方式是:

     for(int i=0;i<list.size();i++) {System.out.println("listIterator: without lambda expression"+list.get(i));}

在Java新特性之后, 代码可以稍加简化:

     for(String str:list) {System.out.println("listIterator: without lambda expression"+str);}

如果使用Lambda 表达式, 则代码可以进一步简化:

list.forEach(str->System.out.println("listIterator: use lambda expression"+str));

完整示例:https://gitee.com/xuemingchen/java-ency/blob/master/src/main/java/com/osxm/je/base/lambda/ListIteratorDemo.java



Lambda表达式的生动理解以及Java Lambda表达式常见使用场景相关推荐

  1. 深入理解Java Lambda表达式,匿名函数,闭包

    前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...

  2. Java Lambda表达式的箭头理解总结

    Java Lambda表达式的箭头理解总结 文章目录 Java Lambda表达式的箭头理解总结 一.简单的Lambda的基础知识点: 二.Lambda 表达式示例 1.实现方法没有参数,无返回值的情 ...

  3. java lambda表达式_高性能的 Lambda 表达式,简洁优雅图文并茂

    来源:知乎 Mingqi 链接:https://www.zhihu.com/question/20125256/answer/324121308 有网友问,Lambda 表达式有何用处?如何使用?在P ...

  4. java 拉姆表达式_Java8 lambda表达式10个示例

    Java 8 lambda表达式示例 转自importNew 原文链接 例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现R ...

  5. Java Lambda表达式初探

    前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未 ...

  6. Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记

    Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记 根据 JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭包或者匿名函数. ...

  7. java lambda表达式详解_Java8新特性:Lambda表达式详解

    在 Java 版本的历次更新迭代中,Java8 是一个特殊的存在,与以往的版本升级不同.我们对 Java8 似乎抱有更大的期待,因为它是 Java5 之后最重要的一次升级,提供了十多个新特性,其中 L ...

  8. java lambda教程_Lambda系列教材 (一)- Java Lambda 表达式教程

    假设一个情景: 找出满足条件的Hero 本教程将从使用普通方法,匿名类,以及Lambda这几种方式,逐渐的引入Lambda的概念 步骤1:普通方法 步骤2:匿名类方式 步骤3:Lambda方式 步骤4 ...

  9. java lambda表达式详解_java8新特性-Lambda表达式的详解(从0开始)

    这几天复习了java8的一些新特性,作为一个从java5以来最具革命性的版本,一直没有来得及总结.本系列文章主要是从<java8实战>总结的.这是第一篇文章主要介绍java8的lambda ...

最新文章

  1. 解读:为什么要做特征归一化/标准化?
  2. 用Leangoo看板工具策划一场活动,看板示例
  3. cacti cmd.php 解析,CACTI搭建 - Linux论坛 - 51CTO技术论坛_中国领先的IT技术社区
  4. AE实现不同图层的合并C#代码
  5. python orm benchmark_python 编写ORM
  6. SpringBoot集成Spring Security —— 第二章自动登录
  7. 华为OJ: 公共字符串计算
  8. nmon 安装和使用
  9. 操作系统线程互斥,锁死机制的简单介绍
  10. 关于设计模式的胡思乱想
  11. JAVA基础知识|lambda与stream
  12. MyBatis:事务回滚
  13. 7-107 找出三位水仙花数 (15 分)
  14. ORA-28009:connection as SYS should be as SYSDBA OR SYSOPER
  15. 时至 2018 年,还有必要学 Vim 吗?
  16. java servlet init方法_Servlet详解之两个init方法的作用
  17. 【设计模式】适配器模式
  18. go语言字符串换行_Go语言字符串
  19. 本地搭建SVN局域网服务器
  20. 量化感知训练_《量化健身 动作精讲》:专业解读健美身材的秘密

热门文章

  1. xhtml css 漏 整理
  2. sql_action
  3. C语言-01基础语法
  4. Jqgrid入门-别具特色的Pager Bar (四)
  5. 分布式一致性算法 之 Paxos算法
  6. VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
  7. sun.misc.BASE64Decoder导入异常及处理思路
  8. 由异常掉电问题---谈xfs文件系统
  9. 【白皮书分享】2021国有企业数字化转型指数与方法路径白皮书.pdf(附下载链接)...
  10. 【报告分享】2019Z世代消费力洞察报告-腾讯.pdf