Talend Java-为每4M行创建一个包含起始ID、结束ID和线程数的哈希映射

Talend Java-为每4M行创建一个包含起始ID、结束ID和线程数的哈希映射,java,Java,它是一个Talend java组件,其中globalMap是一个哈希映射。 我从表中获取最大id,并希望构建一个从start id=1到endIDselect maxid from table的哈希映射;每4米 这是下面的代码,我得到一个错误-局部变量-tLoop_0应该声明为final private final java.util.Map<String, Object> globalMap = new java.util.HashMap<String, Object>

它是一个Talend java组件,其中globalMap是一个哈希映射。 我从表中获取最大id,并希望构建一个从start id=1到endIDselect maxid from table的哈希映射;每4米

这是下面的代码,我得到一个错误-局部变量-tLoop_0应该声明为final

private final java.util.Map<String, Object> globalMap = new java.util.HashMap<String, Object>();
正在构建sharedList,其中将包含列表MapstartID=1、endID=4000001、threadNum=1、MapstartID=4000001、endID=8000001、threadNum=2……等等

java.util.List<java.util.Map<String, String>> sharedList=new java.util.ArrayList<java.util.Map<String, String>>();
为每4M行分配startID和endID:

int cntThread=0;
    long tLoop_0 = 1;
    long tLoop_1 = tLoop_0 + 40000000;
    while (tLoop_1 <= Long.parseLong((row1.maxID).toString())){globalMap.put("threadCount",String.valueOf(cntThread));
    sharedList.add(new java.util.HashMap(){{
        put("start_id",String.valueOf(tLoop_0));
        put("end_id",String.valueOf(tLoop_1));
        put("threadNum",(String)globalMap.get("threadCount"));   
    }}
    );
    cntThread++;
    tLoop_0 = tLoop_1;
    tLoop_1 = tLoop_1 + 40000000;
请建议一种更好的方法来编写此代码

最后,输出应为sharedList格式,以便在其他组件中使用

谢谢。

您得到的局部变量-tLoop_0应声明为final的错误是由匿名类new java.util.HashMap{..}捕获tLoop_0和tLoop_1变量引起的,它们应该是final或有效final,以后不应重新分配

试试这个:

int cntThread = 0;
    long tLoop_0 = 1;
    long tLoop_1 = tLoop_0 + 40000000;
    while (tLoop_1 <= Long.parseLong((row1.maxID).toString())) {
      globalMap.put("threadCount", String.valueOf(cntThread));

      HashMap<String, String> map = new HashMap<>(3);
      map.put("start_id", String.valueOf(tLoop_0));
      map.put("end_id", String.valueOf(tLoop_1));
      map.put("threadNum", String.valueOf(cntThread));

      sharedList.add(map);
      cntThread++;
      tLoop_0 = tLoop_1;
      tLoop_1 = tLoop_1 + 40000000;

摆脱HashMap的双括号初始化。这是一个浪费的噱头,也是这里错误的原因。
int cntThread = 0;
    long tLoop_0 = 1;
    long tLoop_1 = tLoop_0 + 40000000;
    while (tLoop_1 <= Long.parseLong((row1.maxID).toString())) {
      globalMap.put("threadCount", String.valueOf(cntThread));

      HashMap<String, String> map = new HashMap<>(3);
      map.put("start_id", String.valueOf(tLoop_0));
      map.put("end_id", String.valueOf(tLoop_1));
      map.put("threadNum", String.valueOf(cntThread));

      sharedList.add(map);
      cntThread++;
      tLoop_0 = tLoop_1;
      tLoop_1 = tLoop_1 + 40000000;