2016-09-18 1 views
-4

Ich beginne mit Java 8 und ich frage mich, ob ich eine Schleife mit einer Try-Catch-Klausel in eine Lambda-Funktion konvertieren kann? Unten ist die Methode Code Ich mag würde in konvertieren:Verwenden Sie Java Lambda-Ausdrücke

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

Ich weiß nicht, was Parser Sie verwenden, aber ein * Schriftsteller * an einen Parser vorbei sieht sehr ungewöhnlich ... Die Linie 'Datum d = Ergebnisse. keySet(); 'sieht auch nicht sehr überzeugend aus. Und es ist völlig unklar, woher das Ergebnis 'resDaysList' kommt, von dem du kommst. Mit anderen Worten, Sie spucken etwas nicht funktionierenden Code aus und bitten uns, ihn in eine Lambda-Funktion umzuwandeln. Erstens sind wir kein Dienst zum Umschreiben von Code, zweitens gibt es keinen Vorteil bei der Umwandlung in eine Lambda-Funktion. Der Versuch, es in richtigen Code umzuwandeln, könnte sich mehr lohnen. – Holger

Antwort

0

es ist die files Iteration Sie auf eine Stream konvertieren möchten Unter der Annahme, die leicht getan werden kann. Momentan werfen Ihre Loop-Inhalte nicht einmal abgefangene Exceptions, also gibt es hier keine Schwierigkeiten (obwohl ich vorschlagen würde, sie zuerst in ihre eigene Methode umzuwandeln).

0

Da Lambda-Ausdrücke in Java nur ein Mittel sind, Implementierungen von SAM-Schnittstellen als anonyme Objekte bereitzustellen, und die Standardschnittstelle forEach() für interne Iteration bietet, können Sie so ziemlich alles einkapseln möchte in deinem Ausdruck sein.

forEach(Consumer<? super T> action) erwartet, dass Sie es mit einem Objekt der Schnittstelle Consumer versehen, das nur eine Methodenimplementierung benötigt, die ein Objekt jeglicher Art verbraucht und keinen Wert zurückgibt.

Sie einfach den Code innerhalb Ihrer Schleife in den Ausdruck (oder, wie bereits vorgeschlagen, übertragen Sie es in seine eigene Methode zuerst) und Sie sind fertig. Die einzige Sache, über die Sie nachdenken müssen, ist, wie Sie Ihre return-Anweisung behandeln, da es nicht möglich ist, Werte innerhalb der forEach()-Methode zurückzugeben (aufgrund einer sogenannten "terminalen" Methode des Rückgabetyps void). Aber Sie können Ihre Liste in den Lambda-Ausdruck eingeben, Ihre Werte so ändern, wie Sie es für richtig halten und nach dem Lambda ohne Probleme weiterarbeiten.

Der try-catch-Block hat keinen Einfluss auf den Lambda-Ausdruck. Schließlich sind die beiden folgenden Codesegmente sind äquivalent:

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

Also in diesem Fall sollte meine Liste die Liste der Dateien (Dateien) und das Objekt Verbraucher die Datei (f) sein? – User1234

+0

Ja, vielleicht ist es besser, den Code in seine eigene Methode zu übertragen. – User1234