一、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表达式相关推荐

  1. java8 lambda python_【学习笔记】java8 Lambda表达式语法及应用

    本文是慕课网大牧莫邪老师的视频教程一课掌握Lambda表达式语法及应用的学习笔记.如果觉得内容对你有用,可以购买老师的课程支持一下,课程价格1元,十分良心了. 1. 课程介绍 2. 为什么引入Lamb ...

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

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

  3. 最简单的Lambda入门教程

    Lambda简介 Lambda作为函数式编程中的基础部分,在其他编程语言(例如:Scala)中早就广为使用,但在JAVA领域中发展较慢,直到java8,才开始支持Lambda. 抛开数学定义不看,直接 ...

  4. Java 8 Lambda表达式官方入门教程(包括Lambda表达式介绍和语法)

    Java8做出了比较大的更新,支持了很多新特性,Java8引入的Lambda表达式这一特性,使Java8支持函数式编程,目前网上有较多的教程,本文整理了来自Oralce官方提供的教程. Lambda表 ...

  5. 使用类似Lambda的语法切换为Java中的表达式

    从Java 14开始, switch表达式具有额外的Lambda式 ( case ... -> labels )语法,它不仅可以用作语句,还可以用作计算为单个值的表达式. 使用新的类似Lambd ...

  6. 使用NetBeans Lambda支持在Java 8中使用Lambda表达式对列表进行排序

    作为JSR 335的一部分, Lambda表达式已从Java 8开始引入Java语言,这是Java语言的一个重大变化. 如果您想了解更多关于Lambda表达式以及JSR 335的信息,可以访问以下资源 ...

  7. C#中其他简单LINQ查询表达式的简单使用介绍

    本文主要记录下其他简单LINQ表达式,因为比较简单,记录下以后方便回忆,本文也会持续更新. 一些有用的LINQ扩展方法: LINQ表达式 作用 是否延迟查询 Range 生成指定范围内的整数的序列   ...

  8. python中lambda函数if用法-Python中关于Lambda函数的使用总结

    lambda表达式是一种匿名函数,对应python中的自定义函数def,是定义某个函数时比较高级的一种写法.作为python初学者,本文整理了lambda的一些基本用法和特点. lambda和def的 ...

  9. lambda函数以及对 items.sort(key = lambda y:y[1], reverse = True) 的理解。

    今天看书的时候看到这个代码,看到lambda时是比较懵的,后来看了很多的材料才明白的.(看来要学的还是有很多呀!!!) def getText():txt = open("hamlet.tx ...

  10. lambda调用函数_从另一个Lambda函数调用AWS Lambda函数

    lambda调用函数 In this article, I am going to explain how to create an AWS Lambda function and then call ...

最新文章

  1. 婚纱摄影小程序能带来订单吗?小程序如何做营销?
  2. instance “error” 了怎么办?- 每天5分钟玩转 OpenStack(159)
  3. Day 9: TextBlob——对文本进行情感分析
  4. arduino与DS1302时钟调试失败的分析
  5. 拼接字符串的两种方式
  6. Android 模拟器下载、编译及调试
  7. ui设计中的版式设计_设计中的版式-第3部分
  8. db2时间格式化为时间到时分秒_快捷指令为 iPhone 手机照片添加时间水印
  9. 架构设计 | 分布式体系下,服务分层监控策略
  10. mybatis 控制台打印sql脚本
  11. linux 脚本map,shell中map的用法
  12. [19/03/12-星期二] 数组_遍历(for-each)复制java.util.Arrays类
  13. l如何更新linux内核,WSL更新Linux内核版本
  14. Hadoop中的一些基本操作
  15. 第一性原理分子动力学(AIMD)结果分析教程
  16. 欢迎大家在这里提交CSDN博客程序出现的问题
  17. php+sha512+漏洞,PhpMyWind最新版本注入+后台getshell
  18. 浙江更新了小学3年级到9年级信息技术课,小学开始学编程
  19. 助力“互联网+智慧医疗“,医真云致力成为全球领先的医疗云服务提供者
  20. 阿里测试左移和开发赋能分享

热门文章

  1. 前端实现实时消息提醒消息通知
  2. 2022年中国汽车事件数据记录器(EDR)市场现状研究分析与发展前景预测报告
  3. PHP开发常见面试题目
  4. 微信小程序学习笔记一 + 小程序介绍 前置知识
  5. [译]PG15加速排序性能
  6. 华为OD机试 - 不含101的数
  7. 面试题48:最长不含重复字符的子字符串
  8. Game Hacking Fundamentals 学习笔记1
  9. Android平板app开发布局文件,Android平板开发相关
  10. AEJoy —— 彻底搞懂 AE 各种 loop* 表达式【二】