如何在lambda表达式中将对象设置为另一个?我收到了错误
lambda表达式中使用的变量应该是final或者有效的
使用以下代码:
public MyObj myFun(MyObj o) {
MyObj obj = null;
myObjList.stream().filter(o -> ...).forEach(o -> {
// I do some stuff here
// I need here set obj to o, but I got error
obj = o;
});
return myObj; // I need return found obj or null;
}
答案 0 :(得分:4)
您无法将o
指定给外部变量。但是您可以通过流处理返回它。使用map
代替forEach
,然后从地图工具中返回o
。然后执行findAny
或findFirst
- 这将为您提供Optional<MyObj>
。最后,orElse(null)
返回找到并处理的对象,如果没有找到,则返回null
。
MyObj obj = myObjList
.stream()
.filter(o -> ...)
.map(o -> {
// I do some stuff here
// I need here set obj to o, but I got error
return o;
})
.findAny()
.orElse(null);
答案 1 :(得分:0)
您可以简单地在循环中遍历它,然后在找到它时返回值,而不是通过它进行流式传输。
流畅的答案可能是使用类似findFirst的内容。
答案 2 :(得分:0)
而不是使用forEach
而是考虑使用map(o->{...}).findFirst().get()
(或类似的,取决于您的逻辑,如果没有项目相关 - 您的null
案例)。
通常,您应该让流在收集器或选择器中完成(findFirst / findAny等),因为这样可以编写更简单,更清晰的代码