需求:一個方法傳入的參數是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]
