我从Java 8开始,我想知道我是否可以将带有try-catch子句的循环转换为lambda函数? 下面是我想要转换成的方法代码:
for (File f: files) {
JSONOject obj;
try (FileWriter fw= new FileWriter("path.csv")) {
obj= (JSONObject) parser.parse(new FileWriter(f));
readOBJ(valueType,results,obj);
results.put(day, new JobClass(day,work, time,description));
Date d= results.keySet();
Calendar c= Calendar.getinstance();
c.setTime(d);
Map<Date, JobClass> daysList= new HashMap<>();
j.insertDaysList(results,c,fw,daysList);
results.putAll(daysList);
j.resSort(results,resDayList);
} catch (IOException ex) {
e.printStacktrace();
}
}
return resDaysList;
答案 0 :(得分:0)
假设您想要转换为files
的{{1}}次迭代,可以轻松完成。目前,你的循环内容甚至没有抛出未捕获的异常,所以这里没有任何困难(尽管我建议先将它重构为自己的方法)。
答案 1 :(得分:0)
由于Java中的lambda表达式只是方便地将单抽象方法(SAM)接口的实现作为匿名对象提供的手段,标准Stream
接口为内部迭代提供了forEach()
方法,你可以在表达式中封装你想要的所有内容。
forEach(Consumer<? super T> action)
希望您为它提供Consumer
接口的对象,该对象只需要一个方法实现消耗任何类型的对象并且不返回任何值。
因此,您只需将循环中的代码放入表达式中(或者,如已经提出的那样,首先将其转换为自己的方法)并且您已完成。您唯一需要考虑的是如何处理return
声明,因为它无法从forEach()
方法中返回值(因为它是所谓的&#34;终端&#34;返回类型void
的方法。但是你可以将你的列表传递给lambda表达式,以你认为合适的任何方式修改你的值,并在lambda完成后继续使用它,没有任何问题。
try-catch-block不会影响lambda表达式本身。毕竟,以下两段代码是等效的:
List<String> someList = Arrays.asList("example", "of", "lambda", "code");
// lambda style
someList.stream().forEach( item -> {
try {
System.out.println(item.toString());
} catch (Exception e) {
e.printStackTrace();
}
});
// anonymous object style
someList.stream().forEach(new Consumer<String>() {
@Override
public void accept(String s) {
try {
System.out.println(item.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
});