我有一个关于循环包含复杂对象的集合的一般问题。
Collection<Object>
,其中包含我试图从中提取值的 Array<E>
的 LinkedHashMap<K,V>
。物体看起来像;
Collection<Object> dsidsToExclude = Arrays.asList(param.get("idsToExclude"));
for(Object id : dsidsToExclude) {
if(id instanceof ArrayList) {
// Loop over the list of <K,V>
for(Object kv : id) {
// I want to get extract the kv pairs here..
}
}
}
我想知道有效执行此操作的最佳方法是什么,有什么建议吗?谢谢。
答案 0 :(得分:1)
只要输入集合的内容可以指定为sample
(注意使用接口Collection<List<Map<K, V>>>
和List
而不是实现Map
和{{1} }),实现一个带有 ArrayList
类型的泛型方法来摆脱 LinkedHashMap
和显式转换会更合适:
K, V
同样,方法 instanceof
可用于集合、列表和映射:
public static <K, V> doSomething(Collection<List<Map<K, V>>> input) {
for (List<Map<K, V>> list : input) {
for (Map<K, V> map : list) {
for (Map.Entry<K, V> entry : map.entrySet()) {
// do what is needed with entry.getKey() , entry.getValue()
}
}
}
}
此外,可以使用 Stream API,尤其是 forEach
来访问所有最内层地图的内容。或者,可以过滤 public static <K, V> doSomethingForEach(Collection<List<Map<K, V>>> input) {
input.forEach(list ->
list.forEach(map ->
map.forEach((k, v) -> // do what is needed with key k and value v
System.out.printf("key: %s -> value: %s%n", k, v);
);
)
);
}
值,如下所示
flatMap
答案 1 :(得分:0)
Arrays.asList(something)
将生成一个元素的列表。你不需要这样做。
Object object = param.get("idsToExclude");
您可以检查对象并将其转换为列表。
if (object instanceof List) {
List list = (List) object;
}
列表中的每一项都需要检查和转换。
for (Object item : list) {
if (item instanceof Map) {
Map map = (Map) item;
}
}
您可以从地图项中获取键和值。
Object key = map.getKey();
Object value = map.getValue();
完整示例:
Object object = param.get("idsToExclude");
if (object instanceof List) {
List list = (List) object;
for (Object item : list) {
if (item instanceof Map) {
Map map = (Map) item;
Object key = map.getKey();
Object value = map.getValue();
// You can cast key and value to other object if you need it
}
}
}