Вопрос:

Apex Set: Как перебрать набор, если вы не знаете его тип данных?

apex

1096 просмотра

1 ответ

1296 Репутация автора

Набор не может быть преобразован в набор объектов, таких как список. Так что если у вас есть метод, который может взять любой объект, например:

public void handler(Object any_var_including_a_set)

Есть ли способ динамически перебирать содержимое набора, не зная тип данных, который содержит набор?

Автор: jadent Источник Размещён: 09.04.2017 08:27

Ответы (1)


1 плюс

36 Репутация автора

Решение

Там нет понятия Object.getClass()в Апекс; альтернатива - использование instanceofс известным набором типов.

Ниже приведено изменение, handlerкоторое использует JSON.serialize, а затем определяет, ofAnyTypeявляется ли это массив, объект или какой-либо другой примитив.

Предполагая массив (или a Setили Listв Apex), он может быть приведен к List<Object>. Это может быть повторено, чтобы определить instanceofдля каждого члена.

Альтернативная реализация будет использовать ofAnyType instanceof Set<Object_Type_Here>, хотя и не так абстрактно.

public static void handler(Object ofAnyType)
{       
    String jsonString = JSON.serialize(ofAnyType);
    System.debug(jsonString);

    // if array, use List<Object>
    if(jsonString.length() > 0 && jsonString.startsWith('[') && jsonString.endsWith(']'))
    {
        List<Object> mapped = (List<Object>)JSON.deserializeUntyped(jsonString);

        // iterate over mapped, check type of each Object o within iteration
        for(Object o : mapped)
        {
            if(o instanceof String)
            {
                System.debug((String)o);
            }
        }
    }

    // if object, use Map<String, Object>
    else if(jsonString.length() > 0 && jsonString.startsWith('{') && jsonString.endsWith('}'))
    {
        Map<String, Object> mapped = (Map<String,Object>)JSON.deserializeUntyped(jsonString);

        // iterate over mapped, check type of each Object o within iteration
        for(Object o : mapped.values())
        {
            if(o instanceof String)
            {
                System.debug((String)o);
            }
        }
    }
}

Для быстрого тестирования я сохранил handlerв своем StackTestingклассе. Вы можете использовать приведенный ниже код для выполнения анонимного Apex и просмотра результатов.

Integer i = 42;
Set<String> strs = new Set<String>{'hello', 'world'};
Set<Object> objs = new Set<Object>{'hello', 2, new Account(Name = 'Sure')};

StackTesting.handler(i);
StackTesting.handler(strs);
StackTesting.handler(objs);

Обратите внимание, что более надежная реализация будет использовать Patternвнутри Apex, что будет иметь место .startsWithи .endsWithдля определения, jsonStringявляется ли массив или объект.

Автор: Roger Mitchell Размещён: 24.04.2017 02:46
Вопросы из категории :
32x32