有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用java lambda表达式

我从Java8开始,我想知道是否可以将带有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) 个答案

  1. # 1 楼答案

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

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

    因此,您只需将循环中的代码放入表达式中(或者,如前所述,首先将其转移到它自己的方法中),就完成了。唯一需要考虑的是如何处理return语句,因为无法从forEach()方法中返回值(因为它是返回类型为void的所谓“终端”方法)。但是您可以将列表传递到lambda表达式中,以您认为合适的任何方式修改值,并在lambda完成后继续使用它,而不会出现任何问题

    try-catch块不影响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();
        }
      }
    
    });
    
  2. # 2 楼答案

    假设是要转换为Streamfiles迭代,这很容易完成。目前,您的循环内容甚至不会抛出未捕获的异常,因此这里没有困难(尽管我建议首先将其重构为自己的方法)