Lambda简介

Lambda表达式是Java8引入的一个重要特性,相当于一个语法糖。

语法糖(Syntactic sugar)是指在编程语言中引入的一种语法,它可以使代码更易读、更简洁,但并没有引入新的功能或改变语言的底层机制。语法糖并不会改变语言的语义,只是提供了一种更方便的编写方式。

  • Lambda表达式可以被视为匿名函数
  • 允许在需要函数的地方以更简洁的方式定义功能

使用条件:只要是函数式接口就可以用Lambda表达式简化

函数式接口:接口中有且只有一个未实现的方法,这个接口就叫函数式接口

如果接口中有超过一个未实现方法,则不是函数式接口,不能用Lambda表达式 如果接口中有一个未实现方法,有一个默认实现方法,则是函数式接口,可以用Lambda表达式

如:

// 接口中有超过一个未实现方法,不是函数式接口
interface MyInterface {
int sum(int a, int b);
int min(int a, int b);
} // 接口中只有一个未实现的方法,是函数式接口
interface MyCase{
int hello();
default int hello(int a){return a;} //默认实现
}

可以用jdk中提供的检查注解@FunctionalInterface来检查该接口是否为函数式接口

正常情况:

异常情况:

Lambda表达式与函数式接口

举个例子:

有一个接口MyInterface,里面有一个方法sum()。

interface MyInterface {
int sum(int a, int b);
}

如果想要实现这个接口,我们可以使用两种方法。

1.自己写实现类

class MyInterfaceImpl implements MyInterface {
@Override
public int sum(int a, int b) {
return a + b;
}
}

然后调用

public class Lambda {
public static void main(String[] args) {
MyInterface myInterface = new MyInterfaceImpl();
int result = myInterface.sum(1, 2);
System.out.println(result);
}
}

2.创建匿名实现类如果每个接口都要写实现类的话,总觉得会有点麻烦。而且,如果在以后的业务中,要实现的方法不是两数之和,而是两数的平方和的话,那我岂不是要再写一个实现类?为了解决这个问题,我们可以采用匿名实现类,动态的去实现接口。

public class Lambda {
public static void main(String[] args) { // 1. 自己创建实现类对象
MyInterface myInterface = new MyInterfaceImpl();
int result = myInterface.sum(1, 2);
System.out.println("我是 自己创建的实现类对象 " + result); // 2. 创建匿名实现类
MyInterface myInterface1 = new MyInterface() {
@Override
public int sum(int a, int b) {
return a*a + b*b;
}
};
int result1 = myInterface1.sum(1, 2);
System.out.println("我是 匿名实现类 " + result1);
}
}

运行结果:

可以看到,每次创建匿名实现类的时候,有很多格式上的东西是每次都要写的,这样就很冗余。比如下面我选中的这部分:

这部分在上面的接口interface MyInterface中就已经定死了。就算不写new MyInterface(),从创建匿名实现类的前面部分MyInterface myInterface1,也可以看出实现的就是MyInterface接口。

与前面相比,lambda表达式只保留动态的东西,把写死的东西去掉。 用lambda表达式的方式实现接口:

// 3. Lambda表达式实现接口  参数列表 + 箭头 + 方法体
MyInterface myInterface2 = (int a, int b) -> {
return a * a + b * b;
};

这是lambda表达式的完整写法,然而我们可以看到,入参的类型在接口中也是定好的。这就说明还有更简化的写法:

1.参数类型可以不写,只写参数名,参数变量名随意定义

MyInterface myInterface3 = (x, y) -> {
return x * x + y * y;
};

参数名不一定是接口中定义的(a,b),也可以定义为其他的名字,比如(x,y)

2.参数部分在没有入参的时候,最少可以只有一个(),但是不能不写括号!!!!或者在只有一个入参的时候,只有一个参数名

interface MyCase{
int hello();
} public class Lambda {
public static void main(String[] args) {
MyCase myCase = () -> {
return 1;
};
}
}
---------------------------------------------------
interface MyCase1{
int hello(int a);
} public class Lambda {
public static void main(String[] args) {
MyCase1 myCase1 = a -> {
return a + 1;
};
}
}

3.方法体只有一句话的时候,{}和return可以省略

interface MyCase1{
int hello(int a);
} public class Lambda {
public static void main(String[] args) {
MyCase1 myCase11 = a -> a + 2;
// 调用方法
System.out.println(myCase11.hello(1));
}
}

Lambda表达式使用

未来使用函数时接口会比较频繁,当调用某个方法传入参数,这个参数实例是一个接口对象,且只定义了一个方法,就可以直接用Lambda简化写法

 

比较器的使用

当我们使用比较器的时候,可以使用Lambda表达式简化写法

public class Lambda {
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<String>();
names.add("Pidanxia");
names.add("Lucy");
names.add("Bob");
names.add("Tom"); // 普通写法
Collections.sort(names,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
}); // Lambda写法
Collections.sort(names,(o1,o2)->o1.compareTo(o2));
}
}

可以看到Lambda表达式与普通写法相比,简洁了非常多。 除了Lambda表达式之外,还可以用方法引用来简化写法。如:

Collections.sort(names, String::compareTo);

类::方法:表示引用类中的实例方法。

比如例子中的语句,就是说,以names为入参,调用String类中的compareTo方法

线程的使用

// 普通写法
new Thread(){
@Override
public void run() {
System.out.println("Hello");
}
}.start();
// Lambda写法
new Thread(()->System.out.println("Hello")).start();

10 分钟快速搞懂 Lambda 表达式的更多相关文章

  1. 10分钟快速搞定pandas

    本文是对pandas官方网站上<10 Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯 ...

  2. SpringBoot实战:10分钟快速搞定环境

    什么是 springboot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 该框架使用了特定的方式来进行配置,从而使开发人 ...

  3. API 扫盲贴,8分钟快速搞懂 API 框架

    API(应用程序编程接口)是一种传递信息和指令的工具,它通过不同的功能和协议等手段,允许不同的软件或系统之间进行通信和交互.作为程序员或开发人员,API 是你日常工作中必不可少的组成部分.在本文中,我 ...

  4. 3分钟快速搞懂Java的桥接方法

    什么是桥接方法? Java中的桥接方法(Bridge Method)是一种为了实现某些Java语言特性而由编译器自动生成的方法. 我们可以通过Method类的isBridge方法来判断一个方法是否是桥 ...

  5. [转帖]五分钟彻底搞懂你一直没明白的Linux内存管理

    五分钟彻底搞懂你一直没明白的Linux内存管理 https://cloud.tencent.com/developer/article/1462476 现在的服务器大部分都是运行在Linux上面的,所 ...

  6. 一文教你快速搞懂速度曲线规划之S形曲线(超详细+图文+推导+附件代码)

    本文介绍了运动控制终的S曲线,通过matlab和C语言实现并进行仿真:本文篇幅较长,请自备茶水: 请帮忙点个赞

  7. 十分钟学会Java8:lambda表达式和Stream API

    Java8 的新特性:Lambda表达式.强大的 Stream API.全新时间日期 API.ConcurrentHashMap.MetaSpace.总得来说,Java8 的新特性使 Java 的运行 ...

  8. 十分钟学会Java8的lambda表达式和Stream API

    01:前言一直在用JDK8 ,却从未用过Stream,为了对数组或集合进行一些排序.过滤或数据处理,只会写for循环或者foreach,这就是我曾经的一个写照. 刚开始写写是打基础,但写的多了,各种乏 ...

  9. 一篇文章快速搞懂Qt文件读写操作

    导读:Qt当中使用QFile类对文件进行读写操作,对文本文件也可以与QTextStream一起使用,这样读写操作会更加简便.QFileInfo可以用来获取文件的信息.QDir可以用于对文件夹进行操作. ...

  10. 【Istio实际操作篇】Istio入门,10分钟快速安装

    @ 目录 前言 本文说明 请大家务必查看 环境准备 详细版 入门:搭建步骤 Istio软件包下载 下载Istio 卸载 简洁版 安装 卸载 学习不走弯路,gz号「yeTechLog」 前言 上一篇讲了 ...

随机推荐

  1. 让摄像头带上智慧“智驭视界·AIEye”

    接上一篇<物联网浏览器(IoTBrowser)-基于计算机视觉开发的应用"智慧眼AIEye">,经过AI的包装很高级,确实很屌炸天. 智驭视界·AIEye 在科技赋能的 ...

  2. JS实现复制粘贴图片

    最近在开发公司的可视化编辑器应用, 同事们提了一个需求, 即可以直接复制图片到编辑器中粘贴, 生成对应的图片组件. 因为传统的点击上传太麻烦, 得先把图片保存到本地, 然后再回到编辑器点击上传, 选择 ...

  3. CF1950B Upscaling题解

    CF1950B Upscaling题解 题意 给予你一个正整数 \(n\),构造一个如图的字符矩阵. 思路 注意数据 \(1\le n \le 20\),可以发现数据很小,于是我们可以暴力模拟. 我们 ...

  4. 【MySQL】MySQL 执行创建存储过程报错的解决方法

    源码 创建使用while循环插入数据的存储过程 设置mysql分隔符为// delimiter // drop procedure if exists while1 ; create procedur ...

  5. RHCA rh442 009 磁盘算法 RAID相关 磁盘压力测试

    磁盘 一个数据在磁盘A位置,一个数据在磁盘B位置,他们如果隔着很远.这对磁盘来说性能很差 (机械盘,磁头来回移动) 一个数据写进来,他会把数据放到缓存中,经过磁盘调度算法来调度,最后写到硬盘 io读写 ...

  6. TCP协议测试

    TCP协议测试 首先需要测试TCP协议的连接 tcping命令是针对tcp监控的,也可以看到ping值,即使源地址禁ping也可以通过tcping来监控服务器网络状态,除了简单的ping之外,tcpi ...

  7. Python和RPA网页自动化-异常处理Try方法

    我们在跑自动化时为了捕获和处理异常,会增加异常处理Try方法.下面来看看Python和RPA网页自动化中异常处理Try的用法 1.Python中异常处理try的用法 try: test = " ...

  8. 对比python学julia(第二章)--(第三节)玫瑰曲线—数学之美

    3.1.问题描述 在数学世界中有一些美丽的曲线图形,有螺旋线.摆线.双纽线.蔓叶线且.心脏线.渐开线.玫瑰曲线.蝴蝶曲线-- 这些形状各异.简有繁别的数学曲线图形为看似枯燥的数学公式披上精彩纷呈的美丽 ...

  9. javaDoc生成方式

    命令行生成 在cmd控制台窗口上找到需要生成文件的路径,然后执行命令. # javadoc -encoding UTF-8 -charset UTF-8 文件名 javadoc -encoding U ...

  10. 【Java】PDF模板生成PDF文档

    一.需求背景 客户要求一份文书,文书内容有一些表单项,例如: 1.基本的是和否 (单选框或复选框) 2.备注内容(纯文本信息) 3.单位,机构组织,人员,字典项(下拉选择) 4.用户数字签名(图片信息 ...