如何在lambda表达式域中使用局部变量?

如何在lambda表达式域中使用局部变量?

如何在lambda表达式域中使用局部变量?

Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。

JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。

lambda表达式的重要特征:

可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。可选的大括号:如果主体包含了一个语句,就不需要使用大括号。可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。简单示例

// 1. 不需要参数,返回值为 5

() -> 5

// 2. 接收一个参数(数字类型),返回其2倍的值

x -> 2 * x

// 3. 接受2个参数(数字),并返回他们的差值

(x, y) -> x – y

// 4. 接收2个int型整数,返回他们的和

(int x, int y) -> x + y

// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)

(String s) -> System.out.print(s)

口诀:写死小括号,落地大括号!

Lambda表达式也允许使用自由变量(不是参数,而是在外层作用域中定义的变量),就像匿名类一样。 它们被称作捕获Lambda。 Lambda可以没有限制地捕获(也就是在其主体中引用)实例变量和静态变量。但局部变量必须显式声明为final,或事实上是final。

为什么局部变量有这些限制?

(1)实例变量和局部变量背后的实现有一个关键不同。实例变量都存储在堆中,而局部变量则保存在栈上。如果Lambda可以直接访问局部变量,而且Lambda是在一个线程中使用的,则使用Lambda的线程,可能会在分配该变量的线程将这个变量收回之后,去访问该变量。

因此, Java在访问自由局部变量时,实际上是在访问它的副本,而不是访问原始变量。如果局部变量仅仅赋值一次那就没有什么区别了——因此就有了这个限制。

(2)这一限制不鼓励你使用改变外部变量的典型命令式编程模式。 ​

final int num = 1;

Converter stringConverter =(from) -> String.valueOf(from + num); stringConverter.convert(2);

使用伪局部变量int[] ref = {1};然后表达式对其操作

int[] ref = {1};

propertiesVOS.forEach(property -> {

ProductPropertiesExportDTO propertiesExportDTO = new ProductPropertiesExportDTO();

propertiesExportDTO.setAccess(property.getAccess())

.setDefaultValue(property.getDefaultValue())

.setDescription(property.getDescription())

.setIdentifier(property.getIdentifier())

.setName(property.getName())

.setRef(ref[0]);

String specs = property.getSpecs();

int type = property.getDataType();

Object specsAfterObject = getObject(specs, type);

propertiesExportDTO.setDataType(new ProductDataTypeExportDTO(systemConfig.dataTypeMap.get(type), specsAfterObject));

propertiesExportDTOS.add(propertiesExportDTO);

ref[0] = ref[0] + 1;

});

相关文章

河北亿万富豪苑刚个人资料家庭背景曝光
365信誉线上

河北亿万富豪苑刚个人资料家庭背景曝光

🕒 07-08 👁️ 483
甲的五笔怎么打?甲的五笔拆分图.
365信誉线上

甲的五笔怎么打?甲的五笔拆分图.

🕒 07-02 👁️ 5984
8首写给父亲的歌,听着听着就热泪盈眶了
365信誉线上

8首写给父亲的歌,听着听着就热泪盈眶了

🕒 07-09 👁️ 6549