Apex Set:当您不知道它的数据类型时,如何遍历集合?

时间:2017-04-09 20:27:11

标签: apex

无法将Set设置为一组列表等对象。所以如果你有一个方法可以采取任何对象,如:

public void handler(Object any_var_including_a_set)

有没有办法动态迭代Set的内容而不知道该集合持有的数据类型?

1 个答案:

答案 0 :(得分:1)

Apex中没有Object.getClass()的概念;另一种方法是使用instanceof和一组已知的类型。

下面修改handler,使用JSON.serialize,然后确定ofAnyType是数组,对象还是其他原语。

假设一个数组(Apex中的SetList),可以将其强制转换为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);

请注意,更强大的实现会在Apex中使用Pattern,这将取代.startsWith.endsWith以确定jsonString是否为数组或对象