Java - 循环复杂的对象集合

时间:2021-04-20 17:03:55

标签: java loops arraylist collections linkedhashmap

我有一个关于循环包含复杂对象的集合的一般问题。

  • 我有一个 Collection<Object>,其中包含我试图从中提取值的 Array<E>LinkedHashMap<K,V>
  • 我尝试了各种循环来获得键值对,但没有运气,例如;

物体看起来像;

Complex Object

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..
              }
            }
        }

我想知道有效执行此操作的最佳方法是什么,有什么建议吗?谢谢。

2 个答案:

答案 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
    }
  }
}