Lambda表达式中的变量

Lambda表达式中的"变量"

1.场景复现

执行分页查询时,需要对查出来的数据封装页码,定义一个Integer用于递增表示页码,这里采用lambda表达式的规范写法,在表达式中封装并递增页码,但是出现报错

 Integer count=1;
 final IPage<RespDTO> convert = page.convert(x -> {
     final RespDTO respDTO =new RespDTO();
     BeanUtil.copyProperties(x,respDTO);
     respDTO.setNumber(count);
     count++;
     return SalesPointRespDTO;
   });

报错:Variable used in lambda expression should be final or effectively final

2.原理

由报错信息就可以得知,Lambda表达式中的变量必须是实质上final的(effectively final),这样设计的原因:

  1. 线程安全:Lambda表达式可能会被用于多线程环境,例如作为并发任务的一部分。如果Lambda表达式内部的变量可以被外部修改,那么这些变量就不是线程安全的,可能会导致不可预测的行为和错误。通过限制Lambda表达式只能使用final变量,Java确保了Lambda表达式的行为是确定的。
  2. 不变性:Lambda表达式的不变性(immutability)使得它们可以被安全地传递给不同的线程,或者存储在数据结构中,而不需要担心它们的状态会被改变。这种不变性是函数式编程的一个关键特性。
  3. 避免副作用:在函数式编程中,一个重要的概念是避免副作用(side effects),即函数的执行不应该改变外部状态。通过限制Lambda表达式只能使用final变量,Java鼓励开发者编写无副作用的代码,这有助于提高代码的可读性和可维护性。

3.解决方案

这里采用一个类似于欺骗编译器的方法:即定义一个final数组,因为即使数组本身被视为final的,数组的不同元素也可以被修改,我们可以利用数组的第一项作为count

 final Integer[] number = {(parseReqParam.getPageNo() - 1) * parseReqParam.getPageSize() + 1};//计算第一项序号
 final IPage<RespDTO> convert = page.convert(x -> {
       final RespDTO respDTO =new RespDTO();
       BeanUtil.copyProperties(x,respDTO);
       respDTO.setNumber(number[0]);
       number[0]++;
       return SalesPointRespDTO;
  });
在Qt中,lambda表达式可以引用变量,通过捕获列表来控制对外部变量的访问。默认情况下,lambda表达式按值捕获外部变量,即复制一份外部变量的值。这意味着,lambda表达式无法修改通过复制方式捕获的外部变量。如果希望修改这些变量,我们需要使用引用方式进行捕获。例如,使用"[&]"来按引用捕获所有外部变量。然后在lambda表达式中,可以直接修改这些变量的值。 使用lambda表达式引用变量的一个重要注意事项是延迟调用。在lambda表达式定义之后,如果外部变量发生了修改,lambda表达式仍然会使用最初捕获到的变量值。例如,如果按值捕获了一个外部变量,然后修改了这个变量的值,lambda表达式仍然会使用最初捕获到的值。 需要注意的是,lambda表达式的语法形式可简单归纳如下: ``` [capture list](parameters) -> return type { body } ``` 其中,捕获列表用于指定需要捕获的外部变量,参数列表和返回类型用于指定lambda表达式的参数和返回值类型,以及函数体用于实现具体的功能。 在Qt中,lambda表达式可以方便地定义和使用函数对象。捕获的外部变量将成为lambda表达式的成员变量,并可以在函数体中访问。值得注意的是,没有捕获变量lambda表达式可以直接转换为函数指针,而捕获变量lambda表达式则不能转换为函数指针。 总结起来,Qt中的lambda表达式可以引用变量,并通过捕获列表来控制对外部变量的访问。可以按值或按引用捕获外部变量,并在lambda表达式中访问和修改这些变量的值。使用lambda表达式可以方便地定义和使用函数对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值