LinkedHashMap with ArrayList - 如何加载ArrayList?

时间:2013-10-21 21:01:04

标签: java arraylist linkedhashmap

我是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()); }});

        }

    }

所有建议都表示赞赏。

2 个答案:

答案 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}}

请参阅What does it mean to "program to an interface"?