Lambda表达式的生动理解以及Java Lambda表达式常见使用场景
本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明。
Lambda 表达式怎么来的?
在Java 中, 给一个字符串变量赋值就很简单, 类似:
String str = "Hello World.";
- 函数的赋值
如果要把一个函数赋值给一个变量怎么办呢?类似一般的变量赋值,
blockOfCode = public void method(String s) {System.out.println(s);};
- 简化
上面的代码看起来有点啰嗦, 通过以下几点进行简化:
- public 多余,可以删除
- 因为有变量名, 函数名也是多余, 可以删除
- 返回类型由编译器自己判断, 可以删除
- 参数类型也可以删除
通过简化,代码后:
blockOfCode = (s){System.out.println(s);}
- 进一步简化和改善
使用下面两点对上面的代码进一步简化和改善:
- 如果只有一行, 省略大括号
- 使用箭头符号连接参数和函数
改善后的代码如下:
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表达式常见使用场景相关推荐
- 深入理解Java Lambda表达式,匿名函数,闭包
前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...
- Java Lambda表达式的箭头理解总结
Java Lambda表达式的箭头理解总结 文章目录 Java Lambda表达式的箭头理解总结 一.简单的Lambda的基础知识点: 二.Lambda 表达式示例 1.实现方法没有参数,无返回值的情 ...
- java lambda表达式_高性能的 Lambda 表达式,简洁优雅图文并茂
来源:知乎 Mingqi 链接:https://www.zhihu.com/question/20125256/answer/324121308 有网友问,Lambda 表达式有何用处?如何使用?在P ...
- java 拉姆表达式_Java8 lambda表达式10个示例
Java 8 lambda表达式示例 转自importNew 原文链接 例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现R ...
- Java Lambda表达式初探
前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用JDK7.对企业来说,技术上谨慎未 ...
- Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记
Java Lambda 表达式(又名闭包 (Closure)/ 匿名函数 ) 笔记 根据 JSR 335, Java 终于在 Java 8 中引入了 Lambda 表达式.也称之为闭包或者匿名函数. ...
- java lambda表达式详解_Java8新特性:Lambda表达式详解
在 Java 版本的历次更新迭代中,Java8 是一个特殊的存在,与以往的版本升级不同.我们对 Java8 似乎抱有更大的期待,因为它是 Java5 之后最重要的一次升级,提供了十多个新特性,其中 L ...
- java lambda教程_Lambda系列教材 (一)- Java Lambda 表达式教程
假设一个情景: 找出满足条件的Hero 本教程将从使用普通方法,匿名类,以及Lambda这几种方式,逐渐的引入Lambda的概念 步骤1:普通方法 步骤2:匿名类方式 步骤3:Lambda方式 步骤4 ...
- java lambda表达式详解_java8新特性-Lambda表达式的详解(从0开始)
这几天复习了java8的一些新特性,作为一个从java5以来最具革命性的版本,一直没有来得及总结.本系列文章主要是从<java8实战>总结的.这是第一篇文章主要介绍java8的lambda ...
最新文章
- 解读:为什么要做特征归一化/标准化?
- 用Leangoo看板工具策划一场活动,看板示例
- cacti cmd.php 解析,CACTI搭建 - Linux论坛 - 51CTO技术论坛_中国领先的IT技术社区
- AE实现不同图层的合并C#代码
- python orm benchmark_python 编写ORM
- SpringBoot集成Spring Security —— 第二章自动登录
- 华为OJ: 公共字符串计算
- nmon 安装和使用
- 操作系统线程互斥,锁死机制的简单介绍
- 关于设计模式的胡思乱想
- JAVA基础知识|lambda与stream
- MyBatis:事务回滚
- 7-107 找出三位水仙花数 (15 分)
- ORA-28009:connection as SYS should be as SYSDBA OR SYSOPER
- 时至 2018 年,还有必要学 Vim 吗?
- java servlet init方法_Servlet详解之两个init方法的作用
- 【设计模式】适配器模式
- go语言字符串换行_Go语言字符串
- 本地搭建SVN局域网服务器
- 量化感知训练_《量化健身 动作精讲》:专业解读健美身材的秘密
热门文章
- xhtml css 漏 整理
- sql_action
- C语言-01基础语法
- Jqgrid入门-别具特色的Pager Bar (四)
- 分布式一致性算法 之 Paxos算法
- VS2013/2012 下无法打开 源 文件“stdafx.h”的解决方法
- sun.misc.BASE64Decoder导入异常及处理思路
- 由异常掉电问题---谈xfs文件系统
- 【白皮书分享】2021国有企业数字化转型指数与方法路径白皮书.pdf(附下载链接)...
- 【报告分享】2019Z世代消费力洞察报告-腾讯.pdf