Java 8中Lambda嵌套集的错误

Arc*_*ana 0 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;
            }
        }
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在lambda中

for (String id:ids) {
    finalGrid.add(grids.stream().flatMap(ms -> ms.getInnerGrid().stream())
                   .filter(s -> s.getId().equals(id)).findFirst().get());
}
Run Code Online (Sandbox Code Playgroud)

错误:使用传统for()时同样有效,有人可以指导我如何使用lambda实现相同的功能,或者我的代码中是否有一些错过

201-Jan-2018 11:38:29.221 SEVERE [http-apr-9910-exec-8] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service()for servlet [Spring MVC Dispatcher Servlet]与路径的上下文[/ lineManagement]抛出异常[请求处理失败; 嵌套异常是java.util.NoSuchElementException:没有值]带有根本原因java.util.NoSuchElementException:java.util.Optional.get中没有值(Optional.java:135)

shm*_*sel 7

Stream.findFirst()如果流为空,则返回空的可选项,在这种情况下,调用会get()导致异常.最简单的解决方案是使用ifPresent():

grids.stream()
        .flatMap(ms -> ms.getInnerGrid().stream())
        .filter(s -> s.getId().equals(id))
        .findFirst()
        .ifPresent(finalGrid::add);
Run Code Online (Sandbox Code Playgroud)

  • 别客气.如果这解决了您的问题,请[接受答案](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). (4认同)