Spring Boot 如何在出现异常时中断forEach循环

7gyucuyw  于 2022-12-13  发布在  Spring
关注(0)|答案(1)|浏览(277)

我在for循环中有一个forEach循环,类似这样.

for (Iterator iterator = notLoadedFiles.iterator(); iterator.hasNext();) {
            SwapReport swapReport = (SwapReport) iterator.next();
            Reader reader = Files.newBufferedReader(Paths.get(swapReport.getFilePath()));
            CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT);
            List<CSVRecord> initList = csvParser.getRecords();
            
            CSVRecord csvRecord = initList.stream().filter(record -> record.get(0).endsWith("@xxx.com")).findAny().orElse(null);
            if (csvRecord != null) {
                // partition the list
                List<List<CSVRecord>> output = ListUtils.partition(initList, chunkSize);

                // Set data by slice
                output.stream().forEach(slice -> {
                    String inParams = slice.stream().filter(record -> !record.get(0).endsWith("@xxx.com")).map(record -> "'" + record.get(0) + "'").collect(Collectors.joining(",")).toString();
                    try {
                          // Retrieve data for one slice
                          setAccountData(inParams);
                        }
                    } catch (SQLException e) {  
                        // How to break ?
                    }
                });
            }
        }

forEach循环将执行setAccount方法。forEach循环内的try catch块是因为setAccount抛出SQLException。
我想做的是在出现异常的情况下从forEach循环中停止(中断)。
如果出现异常,内部循环将停止,for循环(外部循环)将继续执行迭代器中的下一个元素。
我怎么能那样做呢?
谢谢你

6tdlim6h

6tdlim6h1#

不幸的是,函数.ForEach()没有提供一个好的方法来中断循环。虽然在这个循环中添加一个return语句可以让.ForEach()继续下一个循环,但我相信这不是你要问的。

解决方案

因此,您可以尝试使用Java 9中引入的特性调用.takeWhile()。例如,代码将为:

boolean varNameYouPrefer = true;
output.stream().takeWhile(slice -> varNameYouPrefer).forEach(slice -> {
    String inParams = slice.stream().filter(record -> !record.get(0).endsWith("@xxx.com")).map(record -> "'" + record.get(0) + "'").collect(Collectors.joining(",")).toString();
    try {
            // Retrieve data for one slice
            setAccountData(inParams);
        }
    } catch (SQLException e) {  
        // To break, set varNameYouPrefer to false.
        varNameYouPrefer = false;
    }
});

参考资料

相关问题