2016-09-18 12 views
-4

私はJava 8で始まっています。私はtry-catch句でループをラムダ関数に変換できるのでしょうか?それは簡単に行うことができますがStreamに変換するfiles反復、だと仮定すると、Javaラムダ式を使用する

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'の結果がどこから来るのかは完全には不明です。言い換えれば、動作していないコードを吐き出し、ラムダ関数に変換するように要求します。まず、コード再書込みサービスではない、第2に、これをラムダ関数に変換することによる利点はありません。それを正しいコードに変えようとすると、より多くの報酬を得ることができます。 – Holger

答えて

0

: 以下は私がに変換したいメソッドのコードです。現時点では、ループの内容はキャッチされない例外をスローしないため、ここでは問題はありません(最初に独自のメソッドにリファクタリングすることをお勧めします)。

0

Javaのラムダ式は単なる抽象メソッド(SAM)インターフェイスの実装を匿名オブジェクトとして提供するための手段に過ぎず、標準のStreamインターフェイスでは内部反復のためにforEach()メソッドを提供しています。あなたの表現の中にいたい。

forEach(Consumer<? super T> action)は、Consumerインターフェイスのオブジェクトを提供することを前提としています。これには、1つのメソッド実装で任意の種類のオブジェクトを消費し、値を返さないことが必要です。

ループ内のコードを式に入れるだけです(既に提案されているように、最初に独自のメソッドに転送してください)。考えてみる必要があるのは、forEach()メソッド内の値を返すことができないため(voidといういわゆる「端末」メソッドであるため)、returnステートメントを処理する方法だけです。しかし、ラムダ式にあなたのリストを渡すことができ、ラムダが完了した後に問題なく、あなたが適合しているようにあなたの値を修正し、それを維持することができます。

try-catch-blockはラムダ式自体に影響しません。結局、次の2つのコードセグメントは等価です:

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

関連する問題