java 8中Lambda嵌套集出错
我试图用lambda表达式实现同样的效果,但得到了错误java 8中Lambda嵌套集出错,java,java-8,java-stream,Java,Java 8,Java Stream,我试图用lambda表达式实现同样的效果,但得到了错误 for (String id:ids) { for (MainGrid ms:grids) { for (GridRep innerGrid: ms.getInnerGrid()){ if(innerGrid.getId().equals(id)){ finalGrid.add(innerGrid); break;
for (String id:ids) {
for (MainGrid ms:grids) {
for (GridRep innerGrid: ms.getInnerGrid()){
if(innerGrid.getId().equals(id)){
finalGrid.add(innerGrid);
break;
}
}
break;
}
}
上面的代码是lambda
for (String id:ids) {
finalGrid.add(grids.stream().flatMap(ms -> ms.getInnerGrid().stream())
.filter(s -> s.getId().equals(id)).findFirst().get());
}
错误:在使用传统的for()时也可以使用相同的方法,是否有人可以指导我如何使用lambda实现相同的方法,或者如果我的代码中有一些遗漏
2018年1月31日11:38:29.221严重[http-apr-9910-exec-8]
org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service()
对于具有路径的上下文中的servlet[Spring MVC Dispatcher servlet]
[/lineManagement]引发异常[请求处理失败;嵌套
异常为java.util.NoSuchElementException:不存在值]
根本原因
java.util.NoSuchElementException:java.util.Optional.get(Optional.java:135)中不存在值
Stream.findFirst()
如果流为空,则返回一个空的可选值,在这种情况下,调用get()
会导致异常。最简单的解决方案是使用ifPresent()
:
grids.stream()
.flatMap(ms -> ms.getInnerGrid().stream())
.filter(s -> s.getId().equals(id))
.findFirst()
.ifPresent(finalGrid::add);
我认为,如果在任何时候都找不到元素,您的代码将失败。你能试试这个吗
for (String id:ids) {
Optional optional = grids.stream().flatMap(ms -> ms.getInnerGrid().stream())
.filter(s -> s.getId().equals(id)).findFirst();
if (optional.isPresent())
finalGrid.add(optional.get());
}
当然,请正确设置可选的类型。您实际使用的是LambdaJ库吗?或者只是Java 8的内置lambdas?Java 8内置lambda
grids.stream().flatMap(mainGrid->mainGrid.getInnerGrid().stream()).filter(gridRep->ids.contains(gridRep.getId()).collect(Collectors.toList())代码>为什么您的外环无条件断开?谢谢!是的,当元素为空时,这就是问题所在。两种解决方案都有效。我必须承认,我更喜欢shmosel的答案,因为他解释了可选选项,并且使用了ifPresent。不客气。如果这解决了你的问题,请。