使用java lambda表达式
我从Java8开始,我想知道是否可以将带有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;
# 1 楼答案
由于Java中的lambda表达式只是方便地将单个抽象方法(SAM)接口的实现作为匿名对象提供的一种方法,而标准
Stream
接口为内部迭代提供了forEach()
方法,因此您可以在表达式中封装几乎所有您想要的内容forEach(Consumer<? super T> action)
希望您为它提供Consumer
接口的对象,该接口只需要一个方法实现就可以使用任何类型的对象,并且不返回任何值因此,您只需将循环中的代码放入表达式中(或者,如前所述,首先将其转移到它自己的方法中),就完成了。唯一需要考虑的是如何处理
return
语句,因为无法从forEach()
方法中返回值(因为它是返回类型为void
的所谓“终端”方法)。但是您可以将列表传递到lambda表达式中,以您认为合适的任何方式修改值,并在lambda完成后继续使用它,而不会出现任何问题try-catch块不影响lambda表达式本身。毕竟,以下两段代码是等效的:
# 2 楼答案
假设是要转换为
Stream
的files
迭代,这很容易完成。目前,您的循环内容甚至不会抛出未捕获的异常,因此这里没有困难(尽管我建议首先将其重构为自己的方法)