Apex Set:当你不知道它的数据类型时如何遍历一个集合?
Apex Set: How to iterate through a set when you don't know it's data type?
Set 不能像列表一样转换为一组对象。因此,如果您有一个可以采用任何对象的方法,例如:
public void handler(Object any_var_including_a_set)
有没有办法在不知道集合持有的数据类型的情况下动态迭代集合的内容?
Apex 中没有 Object.getClass()
的概念;另一种方法是将 instanceof
与一组已知类型一起使用。
下面修改了handler
,使用JSON.serialize
,然后判断ofAnyType
是数组、对象还是其他原语。
假设一个数组(Apex 中的 Set
或 List
),它可以转换为 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);
}
}
}
}
为了快速测试,我在 StackTesting
class 中保存了 handler
。您可以使用下面的代码来执行匿名 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
是否是一个数组或对象。
Set 不能像列表一样转换为一组对象。因此,如果您有一个可以采用任何对象的方法,例如:
public void handler(Object any_var_including_a_set)
有没有办法在不知道集合持有的数据类型的情况下动态迭代集合的内容?
Apex 中没有 Object.getClass()
的概念;另一种方法是将 instanceof
与一组已知类型一起使用。
下面修改了handler
,使用JSON.serialize
,然后判断ofAnyType
是数组、对象还是其他原语。
假设一个数组(Apex 中的 Set
或 List
),它可以转换为 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);
}
}
}
}
为了快速测试,我在 StackTesting
class 中保存了 handler
。您可以使用下面的代码来执行匿名 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
是否是一个数组或对象。