在Lambda中增加计数器-Lambda表达式中使用的变量应该是最终的或实际上是最终的

时间:2019-01-28 08:28:54

标签: java vert.x

与Node.js一起工作了几年之后,我正在使用Vert.x,并试图复制我们在require('async')中看到的某些功能

package huru.util;

import java.util.ArrayList;
import java.util.List;

interface AsyncCallback {
  public void cb(Object e, Object v);
}

interface AsyncTask {
  public void run(AsyncCallback cb);
}

interface FinalCallback {
  public void run(Object e, List<Object> v);
}

public class Async {

  static void Parallel (List<AsyncTask> tasks, FinalCallback f) {

    List<Object> results = new ArrayList<Object>();
    int count = 0;

    for(int i = 0; i < tasks.size(); i++){

        tasks.get(i).run((e,v) -> {

          if(e != null){
            f.run(e, null);
            return;
          }

          count++;  // ! here, count needs to be final ??
          results.set(i,v);  

          if(count == tasks.size()){
               f.run(null, results);
          }

        });

    }

  }

}

以上已到达目标,但出现此错误:

  

lambda表达式中使用的变量应为最终变量或有效变量   最终

我认为这是我们在JS中看到的类似问题,随着循环的继续,i的值可能会发生变化。

有人知道如何减轻这一压力吗?将其包装到一个自调用函数中将是如何使用JS做到这一点。

enter image description here

0 个答案:

没有答案