Java 8流过滤局部变量

问题描述 投票:0回答:2
Obj1 x = null;
String key = null;
while(it.hasNext()){
   x = it.next();
   key = x.getKey();
   listObject.stream().filter(e -> e.getKey().equals(key)).findFirst().get();
}

这是在抱怨,有以下信息。"本地变量键必须是最终的或有效的最终..." 我理解lambda上下文是在运行时创建的,它需要不改变的变量。

我如何使用函数式来查找列表中的对象呢?我想避免使用老式的方式,即用 while.

java java-8 stream
2个回答
4
投票

你可以简单地将变量声明移到循环内,从而使它们有效地成为最终变量。

...
while(it.hasNext()){
   Obj1 x = it.next();
   String key = x.getKey();
   listObject.stream().filter(e -> e.getKey().equals(key)).findFirst().get();
}

JITetc 使得在循环外声明变量不再是问题,真的。


4
投票

在这种情况下,你只需要把key做成final。例如,这应该是可行的。

while(it.hasNext()){
   Obj1 x = it.next();
   listObject.stream()
   .filter(e -> e.getKey().equals(x.getKey()))
   .findFirst().get();
}

1
投票

我想避免用老式的方式通过一个while来迭代列表

下面是一种不需要迭代的方法 明确 while 循环。

StreamSupport.stream(spliteratorUnknownSize(it, Spliterator.ORDERED), false)
             .map(...)
             ...
© www.soinside.com 2019 - 2024. All rights reserved.