我是Java的新手,我正在尝试加载包含值的ArrayList的LinkedHashMap。我试图从基于API的查询结果(Salesforce)的查询结果中加载值。
这是错误:“不能引用在不同方法中定义的内部类中的非最终变量细分” - 细分变量以红色加下划线给出此消息,我已经注意到下面关注的行。
CODE
public LinkedHashMap<String, ArrayList<String>> sfFundIdsByContact;
public ArrayList<String> getFundsIDsForContact(Contact aContact)
{
QueryResult queryResults = null;
ArrayList<String> ids = new ArrayList<String>();
int index = 0;
Boolean done = false;
String contactid = aContact.getId();
String SCCPBId = null;
if(sfFundIdsByContact == null || sfFundIdsByContact.size() <= 0){
//Do the Salesforce API CALL and Return the results
...
while (! done)
{
SObject[] records = queryResults.getRecords();
for ( int i = 0; i < records.length; ++i )
{
if(sfFundIdsByContact.containsKey(breakdown.getSalesConnect__Contact__c())){
sfFundIdsByContact.get(breakdown.getSalesConnect__Contact__c()).add(breakdown.getId());
} else {
//Line below in the add(breakdown.getId() - contains the error
sfFundIdsByContact.put(breakdown.getSalesConnect__Contact__c(), new ArrayList<String>() {{ add(breakdown.getId()); }});
}
}
所有建议都表示赞赏。
答案 0 :(得分:3)
在else
块中,而不是:
new ArrayList<String>() {{ add(**breakdown.getId()**); }}
你可以使用:
new ArrayList<String>(Arrays.asList(breakdown.getId())
或者,因为您只需要一个元素ArrayList
,所以可以使用Collections.singletonList
来避免创建临时的varargs数组:
new ArrayList<String>(Collections.singletonList(breakdown.getId())
{ ... }
之后的new ArrayList<>()
创建了ArrayList
的匿名子类,它只是一个内部类。在内部类中,您无法访问非final
局部变量。
答案 1 :(得分:0)
您可以通过始终检索List
循环中的for
值来简化代码,然后null
创建一个新值并将其添加到Map
for (int i = 0; i < records.length; i++) {
List<String> value = sfFundIdsByContact.get(breakdown.getSalesConnect__Contact__c());
if (value == null) {
value = new ArrayList<String>();
sfFundIdsByContact.put(breakdown.getSalesConnect__Contact__c(), value);
}
value.add(breakdown.getId());
}
,否则将值添加到列表中。
LinkedHashMap<String, ArrayList<String>> sfFundIdsByContact
作为建议,请更改
的定义Map<String, List<String>> sfFundIdsByContact
到
{{1}}