【问题标题】:Is there any alternate way to bring lamda variables outside the lamda loop [closed]有没有其他方法可以将 lamda 变量带出 lamda 循环[关闭]
【发布时间】:2020-11-07 01:20:14
【问题描述】:
Result result = ParcelFromDB.getParcelcodes
.stream()
.filter( itr -> itr.getCode().equals(parcelReq.getCode())
.findAny()
.orElse(null);

if(result == null){ ... }

在此之后,我必须采用来自 DB 的现有代码,并在此基础上继续执行其余逻辑。

我无法获取“itr”值,因为它是最终变量。请建议是否有任何替代方法可以在 lamda 之外携带“itr”的值?我尝试了其他方法,但根据代码库,这是我应该做的唯一方法。

【问题讨论】:

  • 您能否格式化您的代码并提供更多详细信息
  • 如果你想使用内部代码中的一些内部变量,你不应该使用 lambda,而是使用经典循环。但更好的是,重新考虑你的逻辑,这样就不需要这种访问了。
  • 请更清楚一点,带出 lambda 是什么意思?你想要itr -> someVariableOutsideLambda = itr这样的东西吗?
  • 为什么不使用result 变量?如果您对不匹配的元素感兴趣,只需反转过滤条件即可。

标签: java filter collections java-8


【解决方案1】:

itr 在 lambda 表达式中表示流中的一个项目。其中之一(由于您使用了findAny)作为result 变量返回,您可以稍后使用。您可以使用forEach 并对所有元素进行操作,而不是仅仅终止流:

ParcelFromDB.getParcelcodes()
            .stream()
            .filter( itr -> itr.getCode().equals(parcelReq.getCode())
            .forEach(itr -> {
                // Do something interesting with the item
            });

【讨论】:

  • 我认为这个问题更多地询问是否可以引用在 lambda 中声明的变量。
【解决方案2】:

Lamba 表达式is 一个匿名的,但仍然是方法,一个匿名方法

在方法范围内声明的变量是该范围的本地变量,无法在该范围之外引用它们。

【讨论】:

  • lambda 表达式不是一种方法,该文档说您可以像这样“思考”它,但仅此而已。
  • @Eugene 这是一个值,如果你想这么挑剔的话,那么它就不是一个函数。想讨论它的字节码代表什么?我的目的是让要求澄清的人清楚这一点。实际上,它的调用语义与函数相同,不同之处在于它不属于类本身的实例。顺便说一句,其他一些文档将其称为 匿名方法
猜你喜欢
  • 2015-05-21
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2018-08-25
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多