【问题标题】:Use java lambda expressions使用 java lambda 表达式
【发布时间】:2016-09-18 17:53:41
【问题描述】:

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

【问题讨论】:

  • 我不知道您使用的是什么解析器,但是将 writer 传递给解析器看起来很不寻常……Date d= results.keySet(); 行看起来也不是很有说服力。而且完全不清楚您返回的结果resDaysList 来自何处。换句话说,你吐出了一些不工作的代码,并要求我们将其转换为 lambda 函数。首先,我们不是代码重写服务,其次,将其转换为 lambda 函数没有任何好处。尝试将其转换为正确的代码可以获得更多回报。

标签: java lambda java-8 java-stream


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    forEach(Consumer&lt;? super T&gt; action) 期望您为它提供Consumer 接口的对象,该对象只需要一个方法实现来使用任何类型的对象并且不返回任何值。

    因此,您只需将循环中的代码放入表达式中(或者,如前所述,首先将其转移到它自己的方法中),然后就完成了。您唯一需要考虑的是如何处理您的 return 语句,因为不可能从 forEach() 方法中返回值(因为它是返回类型 @ 的所谓“终端”方法) 987654327@)。但是您可以将您的列表传递给 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();
        }
      }
    
    });
    

    【讨论】:

    • 所以在这种情况下,我的列表应该是文件列表(文件)和对象消费者文件(f)?
    • 是的,也许最好将代码传递到它自己的方法中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2013-06-30
    • 2015-05-02
    相关资源
    最近更新 更多