Просто смотрю, есть ли у кого-нибудь идеи для этого. У меня есть метод, который разбивает список на список списков, близких к четному размеру.

public static List<List<Object>> splitList(List<Object> InputList,Integer Count){
    List<List<Object>> ObjectList = new List<List<Object>>();
    for(Integer i = 0;i < Count && i < InputList.size();i++){
        ObjectList.add(new List<Object>());
    }
    for(Integer i = 0;i < InputList.Size();i++){
        ObjectList[Math.mod(i, Count)].add(InputList[i]);
    }
    return ObjectList;
}

Но когда я возвращаю список, я не могу, если только я не пропущу трюк, просто примените его, как показано ниже.

List<List<String>> ObjectListList = (List<List<String>>) ApexHelper.splitList(test,3);

Что было бы лучшим способом преобразовать это, кроме как сделать несколько циклов for, как показано ниже?

List<List<Object>> ObjectListList = ApexHelper.splitList(test,3);
List<List<String>> StringListList = new List<List<String>>();
for(List<Object> ObjectList : ObjectListList){
    List<String> StringList = new List<String>();
    for(Object o : ObjectList){
        StringList.add((String) o);
    }
    StringListList.add(StringList);
}
2
KarlLivesey 8 Май 2021 в 18:15

1 ответ

Лучший ответ

До тех пор, пока в Apex не будут разрешены определяемые пользователем универсальные классы и методы, вы не сможете сделать это простым способом. Вы можете изменить свой метод так, чтобы он фактически возвращал List<List<T>> указанного типа, что должно позволять приводить его к этому типу после возврата, к сожалению, нет способа, чтобы конкретный объект возвращал свой собственный тип, поэтому вы должен предоставить пользователю:

public static List<List<Object>> splitList(List<Object> InputList,Integer Count, string listType){
    List<List<Object>> ObjectList = (List<List<Object>>)Type.ForName('List<List<' + listType + '>>').newInstance();
    Type innerListType = Type.ForName('List<' + listType + '>');
    for(Integer i = 0;i < Count && i < InputList.size();i++){
        ObjectList.add((List<Object>)innerListType.newInstance());
    }
    for(Integer i = 0;i < InputList.Size();i++){
        ObjectList[Math.mod(i, Count)].add(InputList[i]);
    }
    return ObjectList;
}
4
IllusiveBrian 8 Май 2021 в 19:25
Кажется, я не могу использовать это, либо мне не нужно использовать какой-либо специальный метод литья, или ниже правильно? @IllusiveBrian List<List<String>> ObjectListList = (List<List<String>>) ApexHelper.splitList(test,3);
 – 
KarlLivesey
8 Май 2021 в 19:15
Мой плохой, не сделал то же самое со списками, добавляемыми в основной список.
 – 
IllusiveBrian
8 Май 2021 в 19:25
Да, работает. Я просто рад, что мне не нужно создавать специальный разделитель для каждого типа данных или объектов, которые я хочу передать.
 – 
KarlLivesey
8 Май 2021 в 19:40
Я полагаю, что единственной альтернативой было бы передать оба списка на входе, а затем клонировать их?
 – 
KarlLivesey
9 Май 2021 в 12:32
Я думаю, это сработает. Вы также можете принудительно использовать TypeException, приведя список к чему-то другому и проанализировав сообщение, чтобы найти конкретный тип списка.
 – 
IllusiveBrian
9 Май 2021 в 14:42