使用java lambda表达式

时间:2016-09-18 17:53:41

标签: java lambda java-8 java-stream

我从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; 

2 个答案:

答案 0 :(得分:0)

假设您想要转换为files的{​​{1}}次迭代,可以轻松完成。目前,你的循环内容甚至没有抛出未捕获的异常,所以这里没有任何困难(尽管我建议先将它重构为自己的方法)。

答案 1 :(得分:0)

由于Java中的lambda表达式只是方便地将单抽象方法(SAM)接口的实现作为匿名对象提供的手段,标准Stream接口为内部迭代提供了forEach()方法,你可以在表达式中封装你想要的所有内容。

forEach(Consumer<? super T> action)希望您为它提供Consumer接口的对象,该对象只需要一个方法实现消耗任何类型的对象并且不返回任何值。

因此,您只需将循环中的代码放入表达式中(或者,如已经提出的那样,首先将其转换为自己的方法)并且您已完成。您唯一需要考虑的是如何处理return声明,因为它无法从forEach()方法中返回值(因为它是所谓的&#34;终端&#34;返回类型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();
    }
  }

});