Day38:Lambda表达式
Lambda表达式
1.1 概述
Lambda是JDK8开始后的一种新语法形式。
作用:简化函数式匿名内部类的代码写法。
简化格式:
/*部类被重写方法的参数)->{
被重写方法的方法体代码
}
->为语法格式,无任何含义
*/
注意:
- Lambda表达式只能简化函数式接口的匿名内部类
那什么是函数式接口?
首先必须是接口、其次要求接口内只有一个抽象方法
有什么好处呢?
简化代码,提升语言表达能力。
1.2 Lambda表达式简化初体验
public class LambdaDemo {
public static void main(String[] args) {
//学习如何使用Lambda表达式 Lamdbda只能简化 函数式接口的匿名内部类
//第一步:先创建函数式匿名内部类
/*
Animals a=new Animals() {//用多态的方式接收它
@Override
public void run() {
System.out.println("喵喵在奔跑");
}//必须重写所有抽象方法
};//匿名内部类本质其实是一个继承类的子类对象或者是接口的实现类对象,
*/
//第二步:简化匿名内部类
Animals a=() ->{System.out.println("喵喵在奔跑");};
go(a);//方法在下面
System.out.println("=================================");
//第三步:继续简化
//匿名内部类是可以作参的
/*go(new Animals() {
@Override
public void run() {
System.out.println("喵喵在奔跑");
}
});
*/
go(() ->{System.out.println("喵喵在奔跑");});
}
//函数式接口
@FunctionalInterface//我们可以在接口上加一个注释:@FunctionalInterface 这样约束接口必须是函数式
interface Animals{//要求是接口
void run();//只含有一个抽象方法
}
//接口实现类对象作参的方法
public static void go(Animals a){
System.out.println("开始奔跑");
a.run();
System.out.println("结束奔跑");
}
}
开始奔跑
喵喵在奔跑
结束奔跑
=================================
开始奔跑
喵喵在奔跑
结束奔跑
1.3 实战简化
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Comparator;
public class LambdaDemo01 {
public static void main(String[] args) {
//建立一个数组
Integer[] a={10,2,5,22,543,1};
//自定义排序方法使之降序
/*Arrays.sort(a, new Comparator<Integer>() {//我们发现这个比较器就是一个函数式匿名内部类
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
System.out.println(Arrays.toString(a));
*/
//简化上面代码
Arrays.sort(a,(Integer o1, Integer o2) ->{return o1-o2;});
System.out.println("===================================");
JFrame win = new JFrame("登录界面");//创建窗口
JButton btn=new JButton("我是按钮");//创建按钮
win.setSize(400,300);
win.setVisible(true);
win.add(btn);
btn.addActionListener(new ActionListener() {//绑定一个监听器
@Override//这是一个函数式匿名内部类
public void actionPerformed(ActionEvent e) {
System.out.println("有人点我哟");
}
});
//简化上面的函数式匿名内部类
/*
btn.addActionListener((ActionEvent e) ->{System.out.println("有人点我哟");});
*/
}
}
1.4 Lambda表达式的省略规则
建立在Lambda表达式的基础上继续简化
- 参数类型可以省略不写
- 如果只有一个参数,参数类型可以不写,同时()也可以省略
- 如果Lambda表达式的方法体代码只有一行代码,则可以省略大括号不写,但同时要省略分号
- 如果Lambda表达式的方法体代码只有一行代码,则可以省略大括号不写,与此同时,此代码是return语句,必须省略return,同时也要省略分号
我们把上面实战的代码进行简化:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.Comparator;
public class LambdaDemo02 {
public static void main(String[] args) {
//建立一个数组
Integer[] a={10,2,5,22,543,1};
//自定义排序方法使之降序
/*Arrays.sort(a, new Comparator<Integer>() {//我们发现这个比较器就是一个函数式匿名内部类
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
System.out.println(Arrays.toString(a));
*/
//简化上面代码
//Arrays.sort(a,(Integer o1, Integer o2) ->{return o1-o2;});
//进一步简化 参数类型可以省略不写
//Arrays.sort(a,(o1,o2) ->{return o1-o2;});
//再进一步简化 如果Lambda表达式的方法体代码只有一行代码,则可以省略大括号不写,与此同时,此代码是return语句,必须省略return,同时也要省略分号
Arrays.sort(a,(o1,o2) -> o1-o2);
System.out.println("===================================");
JFrame win = new JFrame("登录界面");//创建窗口
JButton btn=new JButton("我是按钮");//创建按钮
win.setSize(400,300);
win.setVisible(true);
win.add(btn);
/*
btn.addActionListener(new ActionListener() {//绑定一个监听器
@Override//这是一个函数式匿名内部类
public void actionPerformed(ActionEvent e) {
System.out.println("有人点我哟");
}
});
*/
//简化上面的函数式匿名内部类
/*
btn.addActionListener((ActionEvent e) ->{System.out.println("有人点我哟");});
*/
//进一步简化 如果Lambda表达式的方法体代码只有一行代码,则可以省略大括号不写,但同时要省略分号
btn.addActionListener( e->System.out.println("有人点我哟"));
}
}
Day38:Lambda表达式的更多相关文章
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
- java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
- 背后的故事之 - 快乐的Lambda表达式(二)
快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Lambda 表达式递归用法实例
注意: 使用Lambda表达式会增加额外开销,但却有时候又蛮方便的. Windows下查找子孙窗口实例: HWND FindDescendantWindows(HWND hWndParent, LPC ...
- Spark中Lambda表达式的变量作用域
通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...
- 释放Android的函数式能量(I):Kotlin语言的Lambda表达式
原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...
随机推荐
- Fluentd采集示例
Fluentd通过读取配置文件来加载各插件,日志经由各插件的处理完成输入到输出的整个路由. 本文通过一个最简单的示例来说明配置文件的结构.td-agent.conf默认位于/etc/td-agent/ ...
- 无需Steam的Proton,在你的Linux运行任意Windows游戏!
链接: https://pan.baidu.com/s/1QeJxj9_2aZPk2_uZMzpn9A 提取码: v6t6 包含的版本 Proton4.11 Proton4.2 Proton5.0 ...
- Stanford CoreNLP无法生成实例对象
在服务器上运行Stanford,今日无法启动"StanfordCoreNLP"了,就是运行下面代码一直在运行,不结束,不报错. from stanfordcorenlp impor ...
- 前端性能优化——首屏时间&&白屏时间
1.首屏时间概念 首屏时间是指用户打开一个网站时,直到浏览器首页面内容渲染完成的时间. 2.白屏时间概念 白屏时间即是,浏览器开始显示内容的时间,所以我们一般认为解析完<head>的时刻, ...
- C++智能指针的enable_shared_from_this和shared_from_this机制
前言 之前学习muduo网络库的时候,看到作者陈硕用到了enable_shared_from_this和shared_from_this,一直对此概念是一个模糊的认识,隐约记着这个机制是在计数器智能指 ...
- Linux下MMDetection环境配置
1. 准备工作 Linux发行版. Pop!_OS 22.04 LTS (NVIDIA) (Ubuntu衍生) 对Linux进行配置,更改国内镜像源. 安装conda环境. 官网下载安装脚本(bash ...
- Python基础部分:7、 垃圾回收机制和流程控制
目录 一.垃圾回收机制 1.引用计数 2.标记清除 3.分类代收 二.流程控制 1.理论 2.必备知识 3.分支结构 4.循环结构 一.垃圾回收机制 垃圾回收机制,简称GC,是python解释器自带的 ...
- 记录因Sharding Jdbc批量操作引发的一次fullGC
周五晚上告警群突然收到了一条告警消息,点开一看,应用 fullGC 了. 于是赶紧联系运维下载堆内存快照,进行分析. 内存分析 使用 MemoryAnalyzer 打开堆文件 mat 下载地址:htt ...
- Python标准库之 xml.etree.ElementTree
Element类型是一种灵活的容器对象,用于在内存中存储结构化数据. 每个element对象都具有以下属性: 1. tag:string对象,表示数据代表的种类. 2. attrib:dictiona ...
- 「浙江理工大学ACM入队200题系列」问题 J: 零基础学C/C++83——宁宁的奥数路
本题是浙江理工大学ACM入队200题第八套中的J题 我们先来看一下这题的题面. 题面 题目描述 宁宁参加奥数班,他遇到的第一个问题是这样的:口口口+口口口=口口口,宁宁需要将1~9 九个数分别填进对应 ...