如果一个Object对象可能是集合或者数组那么如何对其进行迭代
需求:一个方法传入的参数是Object类型(假设对象为“items”,使用Object类型也是为了使用多态而增加方法复用性),但已知这个Object对象可能是集合,包括Collection和Map,也可能是数组,包括对象类型数组和基本数据类型数组,那么如何将这个对象中的元素进行迭代,同时添加进一个集合中(我们不关心添加迭代出来的值是什么类型)。
分析:由于这个Object对象(假设为items)可能是Collection集合,也可能是Map集合,可能是对象类型数组,还可能是基本数据类型数组,但不管怎么样,集合或数组都逃不出这四种类型。关于对象类型数组和基本类型数组的迭代,请看上一篇博客。
那么要进行迭代之前,我们首先要来判断这个Object对象是什么类型,如果是Collection集合或者Map集合,那么如何迭代?尤其是Map集合。
解决:将所有的集合或者数组全部转换为Collection集合,如果本来就是Collection集合的子类对象,那么不需要做任何改变,如果是Map集合,那么就调用Map集合的entrySet方法获取Set集合对象(Set集合也是Collection集合的子类),如果是数组对象,不管是对象类型数组还是基本数据类型数组,使用集合类Array来迭代每个元素,封装到一个Collection集合对象中即可,这一点已经在上一篇博客中体现了。
代码:
1 public Collection setItems(Object items) { 2 if(items instanceof Collection) { 3 return (Collection) items; 4 } 5 6 if(items instanceof Map) { 7 Map map = (Map) items; 8 return map.entrySet(); //Set 9 } 10 11 if(items.getClass().isArray()) { 12 Collection coll = new ArrayList(); 13 int length = Array.getLength(items); 14 for(int i=0;i<length;i++) { 15 Object value = Array.get(items, i); 16 coll.add(value); 17 } 18 return coll; 19 } 20 21 return null; 22 }
应用1:
1 List list = new ArrayList(); 2 list.add("aaa"); 3 list.add("bbb"); 4 list.add("ccc"); 5 Collection collection = setItems(list); 6 System.out.println(collection);
结果:[aaa, bbb, ccc]
应用2:
1 Map map = new HashMap(); 2 map.put("aa", "aaaa"); 3 map.put("bb", "bbbb"); 4 Collection collection = setItems(map); 5 System.out.println(collection);
结果:[aa=aaaa, bb=bbbb]
注意因为在setItems方法中,对Map集合进行了entrySet方法的调用,因此我们迭代的是Set集合。
应用3:
1 int[] arr = {1,2,3,4,5}; 2 System.out.println(setItems(arr));
结果:[1, 2, 3, 4, 5]
应用4:
1 String[] arr = {"long","live","sd"}; 2 System.out.println(setItems(arr));
结果:[long, live, sd]