改变lambda

时间:2017-01-28 15:33:21

标签: java lambda final

我试图测试通过听众提供的double是否随每次通话单调增加。 为此,我要保留另一个double进行比较,并在监听器lambda的末尾更新它:

double lastProgress = 0;

operator.addProgressListener(progress -> {
  assertThat(progress, greaterThanOrEqualTo(lastProgress));
  lastProgress = progress;
});

然而,这自然会导致编译错误(Local variable lastProgress defined in an enclosing scope must be final or effectively final),因为lastProgress正在被更改。

对于long变量,解决方法是使用AtomicLong的最终实例,并相应地设置其值。对于double s,其值可以按照here所述映射到long,从而生成以下代码:

AtomicLong lastProgress = new AtomicLong(Double.doubleToLongBits(0));

operator.addProgressListener(progress -> {
  assertThat(progress, greaterThanOrEqualTo(Double.longBitsToDouble(lastProgress.get())));
  lastProgress.set(Double.doubleToLongBits(progress));
});

即使这样有效,但要理解正在发生的事情还是非常不方便而且并不容易。

由于Java没有像AtomicDouble这样的内置类,是否有一种方便的方法来获取代表double的可变最终对象?

0 个答案:

没有答案