文章目录

  • 一、Lambda表达式简介
  • 二、Lambda表达式语法
  • 三、函数引用
    • 1.静态方法引用
    • 2.非静态方法引用
    • 3.构造方法引用
    • 4.对象方法的特殊引用
  • 四、Lambda表达式需要注意的问题

一、Lambda表达式简介

Lambda表达式,是Java8的一个新特性,也是Java8中最值得学习的新特性之一。(另一个新特性是流式编程。)

  • Lambda表达式,从本质上讲是一个匿名方法。可以使用这个匿名方法,实现接口中的方法

  • 功能:通常使用Lambda表达式,是为了简化接口实现的。关于接口实现可以有多种方式实现,例如:①设计接口的实现类、②使用匿名内部类。但是③使用lambda表达式,比这两种方式都简单。

  • 要求:lambda表达式,只能实现函数式接口:即一个接口中,要求实现类必须实现的抽象方法,有且只有一个。

@FunctionalInterface注解 ,用在接口之前,用来判断接口是否是一个函数式接口。如果不是函数式接口会报错。功能类似于@Override。

二、Lambda表达式语法

lambda表达式本质上是一个匿名方法,因此再写lambda表达式时,不需要关心方法名是什么,也不需要关心返回值类型。只需要关心两部分:参数列表方法体

  • ()参数部分:方法的参数列表,要求和实现的接口中的方法参数部分一致,包括参数的数量和类型。
  • {}方法体部分:方法的实现部分,如果接口中定义的方法有返回值,则在实现时,注意返回值的返回。
  • -> :分隔参数部分和方法体部分。
Lambda表达式基础语法:(参数) ->{方法体
}

下面定义6种参数和返回值各不相同的函数式接口,分别使用lambda表达式对接口中的方法进行实现:

下面是针对上面6种函数式接口的lambda表达式实现。

/*** @Description:* @author Guoqianliang* @date 19:50 - 2021/2/15*/
public class BasicSyntax {public static void main(String[] args) {// 1.实现无参数,无返回值的函数式接口NoneReturnNoneParameter lambda1 = () -> {System.out.println("这是无参,无返回值的方法");};lambda1.test();// 2.实现一个参数,无返回值的函数式接口NoneReturnSingleParameter lambda2 = (int a) -> {System.out.println("这是一个参数,无返回值的方法,参数a:" + a);};lambda2.test(10);// 3.实现多个参数,无返回值的函数式接口NoneReturnMutipleParameter lambda3 = (int a, int b) -> {System.out.println("这是多个参数,无返回值的方法,参数a=" + a + ",b=" + b);};lambda3.test(10, 20);// 4.实现无参数,有返回值有返回值的函数式接口SingleReturnNoneParameter lambda4 = () -> {System.out.println("这是无参数,有返回值的方法,返回值是:");return 10;};System.out.println(lambda4.test());// 5.实现一个参数,有返回值的函数式接口SingleReturnSingleParameter lambda5 = (int a) -> {System.out.println("这是一个参数,有返回值的方法,返回值是:");return a;};System.out.println(lambda5.test(10));// 6.实现多个参数,有返回值的函数式接口SingleReturnMutipleParameter lambda6 = (int a, int b) -> {System.out.println("这是多个参数,有返回值的方法,返回值是:");return a + b;};System.out.println(lambda6.test(1, 2));}
}

语法精简进阶:

  • 参数列表的参数类型可以省略。
  • 如果参数列表中的参数有且只有一个,可以省略小括号。
  • 如果方法体中只有一条语句,可以省略大括号。(注:如果这条语句是返回语句,省略了大括号后也要把return关键字省略)

三、函数引用

lambda表达式是为了简化接口。在lambda表达式中,不应该出现比较复杂的逻辑。如果需要处理的逻辑比较复杂,一般情况会单独写一个方法。在lambda表达式中直接引用这个方法即可。即引用一个已经存在的方法,使其代替lambda表达式完成接口的实现。

1.静态方法引用

语法:类::静态方法

  • 在引用的方法后面,不要添加小括号。
  • 引用的这个方法,参数(数量、类型)和返回值,必须要跟接口中定义的一致。
/*** @Description: 方法引用* @author Guoqianliang* @date 0:26 - 2021/2/16*/
public class Lambda1 {private static interface Calculate {int calculate(int a, int b);}private static int calculate(int x, int y) {if (x > y) {return x - y;} else if (x < y) {return y - x;}return x + y;}public static void main(String[] args) {// 静态方法引用Calculate calculate = Lambda1::calculate;System.out.println(calculate.calculate(10, 20));}
}

2.非静态方法引用

语法:对象::非静态方法

  • 在引用的方法后面,不要添加小括号。
  • 引用的这个方法,参数(数量、类型)和返回值,必须要跟接口中定义的一致。
/*** @Description: 方法引用* @author Guoqianliang* @date 0:26 - 2021/2/16*/
public class Lambda1 {private static interface Calculate {int calculate(int a, int b);}// 非静态方法private int calculate2(int a, int b) {if (a != b) {return a - b;}return a + b;}public static void main(String[] args) {// 非静态方法引用Calculate calculate2 = new Lambda1()::calculate2;System.out.println(calculate2.calculate(10, 20));}
}

3.构造方法引用

语法:类名::new

  • 可以通过接口中的方法的参数,区分引用不同的构造方法。
  • 如果某一个函数式接口中定义的方法,仅仅是为了得到一个类的对象。此时就可以使用构造方法的引用,简化这个方法的实现。
/*** @Description: 构造方法引用* @author Guoqianliang* @date 11:20 - 2021/2/16*/
public class Lambda2 {@FunctionalInterfaceprivate interface GetPersonWithNoneParameter {Person get();}@FunctionalInterfaceprivate interface GetPersonWithSingleParameter {Person get(String name);}@FunctionalInterfaceprivate interface GetPersonWithMutipleParameter {Person get(String name, int age);}private static class Person {String name;int age;public Person() {System.out.println("Person类的无参构造方法执行了");}public Person(String name) {this.name = name;System.out.println("Person类的有参构造方法执行了");}public Person(String name, int age) {this.name = name;this.age = age;System.out.println("Person类的两个参数的构造方法执行了");}}public static void main(String[] args) {// 1.使用lambda表达式,实现GetPersonWithNoneParameter接口GetPersonWithNoneParameter getPerson = Person::new;// 2.使用lambda表达式,实现GetPersonWithSingleParameter接口GetPersonWithSingleParameter getPerson2 = Person::new;// 3.使用lambda表达式,实现GetPersonWithMutipleParameter接口GetPersonWithMutipleParameter getPerson3 = Person::new;System.out.println(getPerson.get());System.out.println(getPerson2.get("树先生"));System.out.println(getPerson3.get("你好", 23));}
}

4.对象方法的特殊引用

使用lambda表达式实现某些接口时,如果lambda表达式中包含了某一个对象,此时方法体中,直接使用这个对象调用它的某一个方法就可以完成整体的逻辑。

/*** @Description: 对象方法的特殊应用* @author Guoqianliang* @date 11:54 - 2021/2/16*/
public class Lambda3 {@FunctionalInterfaceprivate interface MyInterface {// String get(Person person);void set(Person person, String name);}private static class Person {private String name;public void setName(String name) {this.name = name;}public String getName() {return name;}}public static void main(String[] args) {Person p1 = new Person();p1.setName("小明");
//        逻辑实现只是为了获取到对象的名字
//        MyInterface lambda2 = Person::getName;
//        System.out.println(lambda2.get(p1));// 逻辑实现只是为了给对象的某些属性进行赋值MyInterface lambda1 = (x, n) -> x.setName(n);MyInterface lambda2 = Person::setName;lambda2.set(p1, "李华");System.out.println(p1.getName());}
}

四、Lambda表达式需要注意的问题

如果用到局部变量,默认会被声明为常量,不能发生值的改变。

/*** @Description:* @author Guoqianliang* @date 13:05 - 2021/2/16*/
public class Lambda4 {public static void main(String[] args) {// 1.定义一个局部变量int x = 10;// 2.使用lambda表达式实现接口LambdaTest lambda = () -> {System.out.println("x=" + x);};// 3. 无法修改常量x// x=20;}
}@FunctionalInterface
interface LambdaTest {void test();
}

Java8语法糖之Lambda表达式相关推荐

  1. java8 ie_Java8语法糖之Lambda表达式_Hudie.的博客-CSDN博客

    原文作者:编程一只蝶 原文标题:Java8语法糖之Lambda表达式 发布时间:2021-02-16 13:08:40 一.Lambda表达式简介 Lambda表达式,是Java8的一个新特性,也是J ...

  2. 【java8新特性】——lambda表达式与函数式接口详解(一)

    一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...

  3. java8新特性之lambda表达式--超级详细版本

    java8新特性之lambda表达式 1.什么是lambda表达式?为什么用它? 2. 为什么Java需要lambda表达式? 3. lambda表达式的语法 4.函数式接口 4.1 什么是函数式接口 ...

  4. Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解

    Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...

  5. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  6. lambda 两个list获取交集_《Java8 实战》笔记 - Lambda 表达式

    Lambda 表达式介绍 ​ 可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它 有参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表.这个定义够大的,让我 ...

  7. 夯实Java基础(二十二)——Java8新特性之Lambda表达式

    1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...

  8. Java8函数式接口与Lambda表达式

    摘要 何为函数式接口? 什么是lambda表达式,lambda表达式的本质: 函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例: 常用Ja ...

  9. Java新特性:Java8函数式接口与Lambda表达式(一)

    摘要 何为函数式接口? 什么是lambda表达式,lambda表达式的本质: 函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例: 常用Ja ...

最新文章

  1. Swift 闭包表达式
  2. python绘制饼图的列表有none_python 有没有库或者函数,类似R的corrplot,画相关系数图的时候,每个方框里面为饼图?...
  3. ASP.NET开源框架之HIPPO技术内幕(四)--多语言的实现
  4. 去掉一键还原 开机按k键
  5. 表字段注释放在哪_橱柜台面6种材质优缺点大解剖,我来测评,告诉你哪一种适合你!...
  6. html双箭头菜单,CSS常用样式之绘制双箭头的示例代码
  7. 线程创建常用的四种方式
  8. 第九届蓝桥杯单片机省赛
  9. 算法入门 13.并查集
  10. 不知不觉自己的C盘越来越大了?你可能需要看一看这个
  11. which must be escaped when used within the value
  12. 我爷爷来了都能看懂的数据库主键,候选键,外键,非空和check的几种约束方式及使用方法
  13. Android和IOS的发展历史
  14. C语言(void *)用法实例
  15. 了解JavaScript中的Promise
  16. 服务器没有自检信息,服务器没内存能自检吗
  17. 【转载】FCKeditor 2.6.3 与FCKeditor.java 2.4在JSP中配置
  18. 查询每个部门工资最低的两个员工的编号,姓名,工资
  19. Mac/Windows使用DBeaver+jdbc驱动连接KingbaseES人大金仓数据库
  20. MD5的应用场景以及MD5 32位和16位的区别

热门文章

  1. 小程序button样式class无效问题
  2. 使用java代码将图片变成ASCll字符
  3. 市场情绪升温,首次全年盈利的欢聚集团释放长期价值的稳定信号
  4. Flink 数据湖 助力美团数仓增量生产
  5. SRA数据库及linux本地下载
  6. js 判断是否为数字
  7. 宏录制流程-制作工资条
  8. FreeSWITCH 空号识别 (mod_da2使用说明)
  9. #红包节奏#领2019天猫618超级红包方法
  10. 巴蜀2311 宫廷守卫