《Java工程师必读手册》——Java极客主义系列——最完美的Lambda表达式只有一行(3)

简介: 《Java工程师必读手册》——Java极客主义系列——最完美的Lambda表达式只有一行(3)

接上篇:

https://developer.aliyun.com/article/1226758?spm=a2c6h.12873581.technical-group.dArticle1226758.524d5a5cAMEBz4

四、 Lambda表达式知识点

 

此外,Lambda表达式还涉及到函数式接口、类型推断、this指向对象、变量作用域等知识点。

 

1. 函数式接口

 

函数式接口是只有一个抽象方法的接口,用作表示Lambda表达式的类型。比如Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口。

 

Java8提供@FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准(即只包含一个方法的接口),虚拟机会自动判断。但是,最好在接口上使用注解@FunctionalInterface进行声明,以避免团队的其他人员错误地往该接口中添加新的方法。举例如下:

 

image.png

 

2. 类型推断

 

1) 类型推断

 

Java编译器会从上下文中推断出用什么函数式接口来配合Lambda表达式。

 

Java编译器类型推断步骤如下:

 

a) 首先,根据Lambda表达式对应的方法、参数和返回值,确定使用了哪个函数式接口;

b) 然后,Java编译器根据这个函数式接口,获取到唯一抽象方法的函数描述符(参数和返回值类型);

c) 最后,Java编译器通过函数描述符推断出Lambda表达式的参数类型。

 

2) 类型检查

 

利用Java编译器推断出来的函数描述符(参数和返回值类型),验证Lambda表达式参数是否合法。

 

比如,我们要从一堆苹果中筛选出直径大于等于80毫米的合格苹果:

 

image.png

 

通过简单推断,该Lambda表达式命中了Stream的方法:

 

image.png

 

其中,命中的函数式接口Predicate定义为:

 

image.png 

 

那么,我们可以推断出Lambda表达式的输入参数类型为Apple,返回值类型为boolean。

 

3. this指向对象

 

总所周知,Lambda表达式可以用来取代唯一抽象方法的内部匿名类的。但是,对于this指针指向对象,却是完全不一样的:

 

对于Java中的匿名内部类,编译器会自动生成它的类名(外部类类名$数字)。而匿名内部类中的this,将指向的是这个内部类对象本身

对于Java中的Lambda表达式中的this,指向的是Lambda表达式所在类的对象。也就是说,Lambda表达式中的this,与普通表达式中的this,没有任何区别。

 

执行下面方法:

 

image.png

 

得到以下结果:

 

image.png

 

可以看出,Lambda表达式this指向对象与普通类this指向对象一致。如果把其中的“this”替换为“this.getClass().getName()”,还能打印出this指向对象类的名称。

 

4. 变量作用域

 

Java局部类和匿名类都存在变量捕获(Captured Variable)和变量隐藏(Shadow Variable),但Lambda表达式却有些许不同——只存在变量捕获,不存在变量隐藏。

 

也就是说,Lambda表达式的作用域:

 

Lambda表达式不会从超类继承或引入新级别的作用域;

Lambda表达式中的声明变量和普通封闭程序块中的一样。

 

image.png

 

Lambda表达式可以无限制地捕获变量或常量,但是局部变量必须定义为final或准final型(不允许修改)。这是因为,Lambda表达式只通过this指针捕获一次局部变量值,后续局部变量发生更改将无法得知。所以,干脆禁止这些局部变量的更改,期望这些局部变量被定义为final或准final型,否则会出现编译错误。

 

image.png


接下篇:https://developer.aliyun.com/article/1226756?groupCode=java

相关文章
|
6天前
|
Java
探索Java中的Lambda表达式
【9月更文挑战第28天】Lambda表达式,这一Java 8引入的轻量级语法结构,为函数式编程提供了强有力的支持。它简化了代码,提高了开发效率,并使得并行处理数据变得异常容易。本文将通过直观的例子和详细的解释,带领读者深入理解Lambda表达式的奥秘,从而在编程实践中更加灵活地运用它们。
|
8天前
|
Java API
探索Java中的Lambda表达式
【9月更文挑战第27天】Lambda表达式,作为Java 8的一大亮点,为我们的编程世界带来了一股清新之风。它以其简洁明了的语法和强大的功能,让我们在处理集合、线程等复杂操作时如鱼得水。本文将带你一探Lambda表达式的奥秘,让你领略到它的魅力所在。
18 6
|
4天前
|
Java 开发者
探索Java中的Lambda表达式:简化你的代码之旅##
【8月更文挑战第62天】 Java 8的发布为开发者带来了诸多新特性,其中最引人注目的无疑是Lambda表达式。这一特性不仅让代码变得更加简洁,还极大地提升了开发的效率。本文将通过实际示例,展示如何利用Lambda表达式来优化我们的代码结构,同时探讨其背后的工作原理和性能考量。 ##
|
5天前
|
Java API 开发者
探索Java中的Lambda表达式
【9月更文挑战第29天】Lambda表达式,在Java编程中,它不仅仅是一种语法糖,更是简化代码、提升效率的利器。本文将通过浅显易懂的语言和实际代码示例,带你走进Lambda的世界,了解其背后的原理和在日常开发中的应用,让你的代码更简洁、更高效。
|
8天前
|
Java API 开发者
探索Java中的Lambda表达式:简化代码,提升效率
【9月更文挑战第27天】在Java 8中引入的Lambda表达式为编程带来了革命性的变化。通过简洁的语法和强大的功能,它不仅简化了代码编写过程,还显著提升了程序的执行效率。本文将深入探讨Lambda表达式的本质、用法和优势,并结合实例演示其在实际开发中的应用。无论你是Java新手还是资深开发者,都能从中获得启发,优化你的代码设计。
|
10天前
|
Java 程序员 API
Java 8新特性之Lambda表达式与Stream API的探索
【9月更文挑战第24天】本文将深入浅出地介绍Java 8中的重要新特性——Lambda表达式和Stream API,通过实例解析其语法、用法及背后的设计哲学。我们将一探究竟,看看这些新特性如何让Java代码变得更加简洁、易读且富有表现力,同时提升程序的性能和开发效率。
|
2月前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
5月前
|
Java API
Java 8新特性之Lambda表达式与Stream API
【5月更文挑战第17天】本文将介绍Java 8中的两个重要特性:Lambda表达式和Stream API。Lambda表达式是一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁。Stream API是一种用于处理集合的新工具,它提供了一种高效且易于使用的方式来处理数据。通过结合使用这两个特性,我们可以编写出更加简洁、高效的Java代码。
51 0
|
2月前
|
存储 算法 Oracle
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
60 8
|
2月前
|
Java API
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的
下一篇
无影云桌面