Java教程

如何在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<Integer, String> 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;
        });

这篇关于如何在lambda表达式域中使用局部变量?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!