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