2016-09-18 37 views
-4

我開始與Java 8,我想知道如果我可以將一個循環與try-catch子句轉換爲lambda函數? 下面是方法的代碼,我想轉換爲:使用java的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

我不知道你用的是什麼解析器,但不得傳遞*作家*到分析器的時候看起來非常不尋常的...行'日期d =結果。 keySet();'也不太令人信服。而且你完全不清楚resDaysList的結果是從哪裏來的。換句話說,你吐出一些不起作用的代碼,並要求我們將它轉​​換爲lambda函數。首先,我們不是代碼重寫服務,其次,將其轉換爲lambda函數沒有任何好處。試圖將其轉化爲正確的代碼可以獲得更多回報。 – Holger

回答

0

假設這是你想要轉換爲Streamfiles迭代,可以很容易地完成。目前,你的循環內容甚至不會拋出未被捕獲的異常,所以這裏沒有任何困難(儘管我會建議首先將它重構成它自己的方法)。

0

由於Java中的lambda表達式只是將單個抽象方法(SAM)接口的實現方便地提供爲匿名對象的一種方式,並且標準接口提供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(); 
    } 
    } 

}); 
+0

所以在這種情況下,我的列表應該是文件(文件)列表和文件(f)的對象使用者? – User1234

+0

是的,也許最好是將代碼傳入自己的方法。 – User1234