无法从列表<object>转换为list <callable <type>&gt;的java

时间:2015-12-23 18:46:33

标签: java

我有以下代码,我试图在我的项目中允许线程。这里是我的方法,它为每个现有的PrgState(即每个线程)执行一步。

public void oneStepForAllPrg(List<PrgState> prgList){

    ExecutorService executor = Executors.newFixedThreadPool(100);
    prgList.forEach(prg ->controllerMethod(false,prg.toString()));
    //here prepare the list of callables
    List<Callable<PrgState>> callList = new ArrayList<>();
    callList = prgList.stream()
            .map(p ->(() -> {return p.oneStep();}))
            .collect(Collectors.toList()); //receive error here
    //start the execution of the callables
    //it returns the list of new created threads

    List<PrgState> newPrgList =        //the error here if I modify
             executor.invokeAll(callList).stream()
                         .map(future -> {try  {
                                  return future.get();
                         }catch (Exception e){
                              System.out.println("Error ctrl method oneStepForAllPrg");
                         }
                         })
         .filter(p -> p!=null )
         .collect(Collectors.toList());
    prgList.addAll(newPrgList);
    prgList.forEach(prg ->prg.toString());

public void controllerMethod(boolean flag,String s){
    PrgState prg;
    if (flag == false){
        writeToFile(s);
    }
    if (flag == true){
        //
    }
}

如何管理错误:

cannot convert from List<Object> to List<Callable<PrgState>>?

我的意思是,他们俩都是名单,为什么不被允许?

2 个答案:

答案 0 :(得分:2)

假设PrgState.oneStep()返回一个PrgState,请尝试更改

.map(p ->(() -> {return p.oneStep();}))

.map(p -> ((Callable<PrgState>)(() -> p.oneStep())))

你不能只是撒上lambda,他们只是一个匿名类的语法糖,编译器需要知道它是什么类型的

编辑:

第二个错误与第一个错误无关;你的未来 - &gt;如果有异常,lambda不会返回任何内容,而且可能无法编译。

EDIT2:

此代码将生成newPrgList:

import static java.util.concurrent.CompletableFuture.*;

...

Executor e = Executors.newFixedThreadPool (100);
List<PrgState> = prgList.stream ()
                        .map (p -> supplyAsync ( () -> p.oneStep (), e))
                        .reduce (new ArrayList<PrgState> (), (a, f) -> {
  try {
    a.add (f.get ());
    return a;
  } catch (Exception e1) {
    throw new RuntimeException (e1);
  }
}, (a1, a2) -> {
  ArrayList<PrgState> a = new ArrayList<> ();
  a.addAll (a1);
  a.addAll (a2);
  return a;
});

答案 1 :(得分:0)

这可能会对您有所帮助。

将块大小定义为10000。

int chunkSize = 10000;
final AtomicInteger counter = new AtomicInteger(0);     
List<CallableObj> recordsList = dataList.stream().collect(Collectors.groupingBy(it -> counter.getAndIncrement() / chunkSize)).values()
.stream().map(obj -> new CallableObj(obj)).collect(Collectors.toList());

Callable对象如下:

    public class CallableObj<T> implements Callable<T> {
        private List<Object> recordsList;


        public CallableObj(List<Object> recordsList) {
            super();
            this.recordsList = recordsList;
        }

        @Override
        public T call() throws Exception{
             //code....
        }
    }

希望这可以解决目的。

谢谢

Atul