Lambda表达式到底是什么?——简单了解Lambda表达式
一、Lambda表达式是什么
简单来说,Lambda表达式是一个可传递的代码段。可以不借助对象传递的一个代码段。那java作为一个面向对象的语言,为什么要加入这么一个特性呢?
二、为什么使用Lambda表达式
从一个简单的例子开始。
比如现在有一个Person类
package POJO;import lombok.Data;
import java.util.Objects;/*** @author wangtianqi* @create 2020-08-19 15:59*/
@Data
public class Person {private String name;private Integer age;private String country;private char sex;
}
如果不使用Lambda表达式将下面这个Person集合中的元素按照年龄从小到大排序。
List<Person> personList = new ArrayList<>();//personList.add(new Person("欧阳霜",18,"中国",'F'));personList.add(new Person("欧阳雪", 18, "中国", 'F'));personList.add(new Person("Tom", 24, "美国", 'M'));personList.add(new Person("Harley", 22, "英国", 'F'));personList.add(new Person("向天笑", 23, "中国", 'M'));personList.add(new Person("李康", 22, "中国", 'M'));personList.add(new Person("小梅", 20, "中国", 'F'));personList.add(new Person("何雪", 21, "中国", 'F'));personList.add(new Person("李康", 22, "中国", 'M'));
很自然的可以想到,使用工具类Collections中的sort方法。sort方法需要提供一个Comparator接口的实现类。
package POJO;import java.util.Comparator;/*** @author wangtianqi* @create 2020-09-08 10:03*/
public class ComparePerson implements Comparator<Person> {@Overridepublic int compare(Person p1, Person p2) {return p1.getAge() - p2.getAge();}
}
然后使用sort方法将集合排序。
/*** lambda表达式相关** @author wangtianqi* @create 2020-09-08 10:05*/
public class Test3 {public static void main(String[] args) {List<Person> personList = new ArrayList<>();//personList.add(new Person("欧阳霜",18,"中国",'F'));personList.add(new Person("欧阳雪", 18, "中国", 'F'));personList.add(new Person("Tom", 24, "美国", 'M'));personList.add(new Person("Harley", 22, "英国", 'F'));personList.add(new Person("向天笑", 23, "中国", 'M'));personList.add(new Person("李康", 22, "中国", 'M'));personList.add(new Person("小梅", 20, "中国", 'F'));personList.add(new Person("何雪", 21, "中国", 'F'));personList.add(new Person("李康", 22, "中国", 'M'));Collections.sort(personList,new ComparePerson());// 遍历打印for (Person person : personList) {System.out.println(person);}}
}
例子到这就结束了。再回过头看main方法中的Collections.sort(personList,new ComparePerson());
这条语句。如果仅仅是看这条语句,并不能直观的了解到这个排序是按照哪个条件进行的。需要找到ComparePerson这个实现类,才能看到排序的条件。代码的可读性不高。并且提供实现类,也需要编写代码,代码不简洁。
如果java支持函数式编程,就可以很好的解决这问题。例如ComparePerson类中只提供了一种方法。使用函数式编程,就不需要为了这个代码段编写一个类,直接在需要的地方编写一个代码段即可。
lambda表达式就是为了让java实现函数式编程而出现的。
三、Lambda表达式的语法
接着上面一节,这次我们使用Lambda表达式实现集合排序。
import POJO.ComparePerson;
import POJO.Person;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** lambda表达式相关** @author wangtianqi* @create 2020-09-08 10:05*/
public class Test3 {public static void main(String[] args) {List<Person> personList = new ArrayList<>();//personList.add(new Person("欧阳霜",18,"中国",'F'));personList.add(new Person("欧阳雪", 18, "中国", 'F'));personList.add(new Person("Tom", 24, "美国", 'M'));personList.add(new Person("Harley", 22, "英国", 'F'));personList.add(new Person("向天笑", 23, "中国", 'M'));personList.add(new Person("李康", 22, "中国", 'M'));personList.add(new Person("小梅", 20, "中国", 'F'));personList.add(new Person("何雪", 21, "中国", 'F'));personList.add(new Person("李康", 22, "中国", 'M'));// Collections.sort(personList,new ComparePerson());Collections.sort(personList, (p1, p2) -> p1.getAge() - p2.getAge());for (Person person : personList) {System.out.println(person);}}
}
我们使用非常简短的一个代码段完成了ComparePerson类提供的功能。代码更简洁。并且对比使用实现类的语句,这段代码可以很清楚的了解到这次排序是按照年龄进行的。可读性更好。
lambda表达式基本语法
- Java8中引入了一个新的操作符,
->
,该操作符称为箭头操作符或者Lambda操作符,箭头操作符将Lambda表达式拆分成两部分; - 左侧: Lambda表达式的参数列表,对应的是接口中抽象方法的参数列表;
- 右侧: Lambda表达式中所需要执行的功能(Lambda体),对应的是对抽象方法的实现;(函数式接口(只能有一个抽象方法))
- Lambda表达式的实质是 对接口的实现;当接口只有一个方法(非静态方法,非默认方法)时,才可以使用lambda表达式。
四、函数式接口
上面提到了当接口只有一个方法(非静态方法,非默认方法)时,才可以使用lambda表达式。 在java中这种接口叫做,函数式接口。可以使用@FunctionalInterface
注解来声明某个接口是一个函数式接口。
当在方法中的某个参数为函数式接口的引用时,在调用该方法时,就可以使用lambda表达式为该接口引用提供一个具体实现。
看一眼sort方法的源码,第二个参数Comparator<? super T> c
是一个接口引用。
public static <T> void sort(List<T> list, Comparator<? super T> c) {list.sort(c);}
点进去看一眼,果然Comparator<T>
是一个函数式接口。所以我们可以在使用sort方法时使用lambda表达式作为第二个参数。
@FunctionalInterface
public interface Comparator<T> {
五、Java中提供的四大函数式接口
如果你想要在自己的方法中添加函数式接口引用作为参数,Java提供了非常有代表性的四个函数式接口,我们只需要选择自己想要的接口即可。
四大函数式接口
Consumer< T >
消费型 接口:void accept(T t);
- 消费型接口Consumer,是一个有参数,但是无返回值类型的接口(void accept(T t);)
Supplier< T >
供给型接口 :T get();
- 供给型接口Supplier,是一个只有产出,没有输入,就是只有返回值,没有参数(T get();)
Function< T , R >
函数式接口 :R apply (T t);
- 函数型接口Function<T,R>,是一个参数为T类型,返回值为R类型的接口(R apply(T t);)
Predicate< T >
断言型接口 :boolean test(T t);
- 断言型接口Predicate,是一个参数为T类型,返回值为boolean类型的接口(boolean test(T t);)
六、总结
为何使用: 使用lambda表达式可以让代码的可读性更强,同时代码更简洁。但lambda的意义不仅仅于此,这里只是最显而易见的好处。
何时使用: 当调用的方法中的某个参数为函数式接口的引用时,就可以使用lambda表达式为该接口引用提供一个具体实现。
实质: 接口的具体实现。只不过不需要单独编写类。
Lambda表达式到底是什么?——简单了解Lambda表达式相关推荐
- java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用
本文是慕课网大牧莫邪老师的视频教程一课掌握Lambda表达式语法及应用的学习笔记.如果觉得内容对你有用,可以购买老师的课程支持一下,课程价格1元,十分良心了. 1. 课程介绍 2. 为什么引入Lamb ...
- java lambda表达式详解_java8新特性-Lambda表达式的详解(从0开始)
这几天复习了java8的一些新特性,作为一个从java5以来最具革命性的版本,一直没有来得及总结.本系列文章主要是从<java8实战>总结的.这是第一篇文章主要介绍java8的lambda ...
- 最简单的Lambda入门教程
Lambda简介 Lambda作为函数式编程中的基础部分,在其他编程语言(例如:Scala)中早就广为使用,但在JAVA领域中发展较慢,直到java8,才开始支持Lambda. 抛开数学定义不看,直接 ...
- Java 8 Lambda表达式官方入门教程(包括Lambda表达式介绍和语法)
Java8做出了比较大的更新,支持了很多新特性,Java8引入的Lambda表达式这一特性,使Java8支持函数式编程,目前网上有较多的教程,本文整理了来自Oralce官方提供的教程. Lambda表 ...
- 使用类似Lambda的语法切换为Java中的表达式
从Java 14开始, switch表达式具有额外的Lambda式 ( case ... -> labels )语法,它不仅可以用作语句,还可以用作计算为单个值的表达式. 使用新的类似Lambd ...
- 使用NetBeans Lambda支持在Java 8中使用Lambda表达式对列表进行排序
作为JSR 335的一部分, Lambda表达式已从Java 8开始引入Java语言,这是Java语言的一个重大变化. 如果您想了解更多关于Lambda表达式以及JSR 335的信息,可以访问以下资源 ...
- C#中其他简单LINQ查询表达式的简单使用介绍
本文主要记录下其他简单LINQ表达式,因为比较简单,记录下以后方便回忆,本文也会持续更新. 一些有用的LINQ扩展方法: LINQ表达式 作用 是否延迟查询 Range 生成指定范围内的整数的序列 ...
- python中lambda函数if用法-Python中关于Lambda函数的使用总结
lambda表达式是一种匿名函数,对应python中的自定义函数def,是定义某个函数时比较高级的一种写法.作为python初学者,本文整理了lambda的一些基本用法和特点. lambda和def的 ...
- lambda函数以及对 items.sort(key = lambda y:y[1], reverse = True) 的理解。
今天看书的时候看到这个代码,看到lambda时是比较懵的,后来看了很多的材料才明白的.(看来要学的还是有很多呀!!!) def getText():txt = open("hamlet.tx ...
- lambda调用函数_从另一个Lambda函数调用AWS Lambda函数
lambda调用函数 In this article, I am going to explain how to create an AWS Lambda function and then call ...
最新文章
- 婚纱摄影小程序能带来订单吗?小程序如何做营销?
- instance “error” 了怎么办?- 每天5分钟玩转 OpenStack(159)
- Day 9: TextBlob——对文本进行情感分析
- arduino与DS1302时钟调试失败的分析
- 拼接字符串的两种方式
- Android 模拟器下载、编译及调试
- ui设计中的版式设计_设计中的版式-第3部分
- db2时间格式化为时间到时分秒_快捷指令为 iPhone 手机照片添加时间水印
- 架构设计 | 分布式体系下,服务分层监控策略
- mybatis 控制台打印sql脚本
- linux 脚本map,shell中map的用法
- [19/03/12-星期二] 数组_遍历(for-each)复制java.util.Arrays类
- l如何更新linux内核,WSL更新Linux内核版本
- Hadoop中的一些基本操作
- 第一性原理分子动力学(AIMD)结果分析教程
- 欢迎大家在这里提交CSDN博客程序出现的问题
- php+sha512+漏洞,PhpMyWind最新版本注入+后台getshell
- 浙江更新了小学3年级到9年级信息技术课,小学开始学编程
- 助力“互联网+智慧医疗“,医真云致力成为全球领先的医疗云服务提供者
- 阿里测试左移和开发赋能分享