[英]Use java lambda expressions
我從 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;
假設它是您想要轉換為Stream
的files
迭代,這可以輕松完成。 目前,您的循環內容甚至不會拋出未捕獲的異常,因此這里沒有困難(盡管我建議先將其重構為自己的方法)。
由於 Java 中的 lambda 表達式只是一種將單抽象方法 (SAM) 接口的實現方便地提供為匿名對象的方法,而標准的Stream
接口為內部迭代提供了forEach()
方法,因此您可以封裝幾乎所有想要的內容在你的表情中。
forEach(Consumer<? super T> action)
期望你為它提供一個Consumer
接口的對象,它只需要一個方法實現來消費任何類型的對象並且不返回任何值。
因此,您只需將循環中的代碼放入表達式中(或者,如已經提出的那樣,首先將其轉移到它自己的方法中),然后就完成了。 您唯一需要考慮的是如何處理您的return
語句,因為不可能從forEach()
方法中返回值(因為它是返回類型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();
}
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.