簡體   English   中英

使用 java lambda 表達式

[英]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; 

假設它是您想要轉換為Streamfiles迭代,這可以輕松完成。 目前,您的循環內容甚至不會拋出未捕獲的異常,因此這里沒有困難(盡管我建議先將其重構為自己的方法)。

由於 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM