如果一个Object对象可能是数组那么如何对其进行迭代
需求:一个方法传入的参数是Object类型(假设对象为“items”,使用Object类型也是为了使用多态而增加方法复用性),但已知这个Object对象可能是基本类型数组,也可能是对象数组,如何将这个对象中的数组元素进行迭代,同时添加进一个集合中(我们不关心添加迭代出来的值是什么类型)。
分析:如果想将一个数组迭代添加进一个集合中,那么我们最可能想到是的使用数组工具类Arrays的asList(T…a)方法:
但是这个方法的不足之处在于,对于对象数组,可以将对象数组中的每个元素迭代添加到一个List集合中,但是对于基本类型数组,由于数组中的每个元素并不是对象,所以在返回的List集合中只是保存基本类型数组的对象(即该基本类型数组的hashcode)。
解决:
首先判断方法传入Object类型(假设对象为“items”)的参数是否真的是数组。这里要使用反射,在Class类中有“isArray”方法可以满足次需求:
接着使用数组类Array,既然是数组类,那么Array必定封装了操作数组的方法,无论是对象类型数组还是基本类型数组,这里我们要对这个对象(“items”,Object类型)进行迭代,那么只需要使用数组类Array中的getLength(Object array)方法和get(Object array, int index)即可。
代码:
public Collection setItems(Object items) {
if(items.getClass().isArray()) { Collection coll = new ArrayList();
int length = Array.getLength(items); for(int i=0;i<length;i++) {
Object value = Array.get(items, i);
coll.add(value);
}
return coll;
}else{
throw new RuntimeException("items is not Array");
}
}
应用1:
int[] arr = {1,2,3,4,5};
System.out.println(setItems(arr));
结果:[1, 2, 3, 4, 5]
应用2:
String[] arr = {"long","live","sd"};
System.out.println(setItems(arr));
结果:[long, live, sd]
从上面两个应用可以看到,在我们的方法参数设置为Object,这样做使用到了多态,因此无论我们传入的是对象类型数组还是基本类型数组都可以进行迭代。
如果一个Object对象可能是数组那么如何对其进行迭代的更多相关文章
- new一个Object对象占用多少内存?
Java的自动内存管理机制省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是G1的出现,改善了垃圾回收中stop the world的状况. 也许很多人都没有考虑过这 ...
- [转]new一个Object对象占用多少内存?
我们分解下ArrayList arr = new ArrayList();等同于ArrayList arr = null;//初始化arr = new ArrayList();//实例化这两个过程.初 ...
- JAVA将Object对象转byte数组
/** * 将Object对象转byte数组 * @param obj byte数组的object对象 * @return */ public static byte[] toByteArray(Ob ...
- 如果一个Object对象可能是集合或者数组那么如何对其进行迭代
需求:一个方法传入的参数是Object类型(假设对象为“items”,使用Object类型也是为了使用多态而增加方法复用性),但已知这个Object对象可能是集合,包括Collection和Map,也 ...
- 【转】js判断一个object对象是否为空
判断一个对象是否为空对象,本文给出三种判断方法: 1.最常见的思路,for...in... 遍历属性,为真则为“非空数组”:否则为“空数组” for (var i in obj) { // 如果不为空 ...
- js判断一个 object 对象是否为空
方法一:使用for...in for...in... 遍历属性,为真则为“非空数组”:否则为“空数组” for (var i in obj) { return true // 如果不为空,则会执行到 ...
- php 分享一个object(stdclass)转数组的函数
经常调用一个借口之后 返回的内容是json串,利用php函数json_decode() 解析json串之后得到的 数据类型为object(stdclass) 这是一个对象,要取其中的内容也可以 取得, ...
- 原生JS:Object对象详细参考
Object对象详细参考 本文参考MDN做的详细整理,方便大家参考MDN JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象. 构造函数: Objec ...
- javascript ES5 Object对象
原文:http://javascript.ruanyifeng.com/stdlib/object.html 目录 概述 Object对象的方法 Object() Object.keys(),Obje ...
随机推荐
- BZOJ 1787: [Ahoi2008]Meet 紧急集合( 树链剖分 )
这道题用 LCA 就可以水过去 , 但是我太弱了 QAQ 倍增写LCA总是写残...于是就写了树链剖分... 其实也不难写 , 线段树也不用用到 , 自己YY一下然后搞一搞就过了...速度还挺快的好像 ...
- CUDA纹理绑定
纹理绑定的一般步骤: size_t fea_pitch; texture<unsigned char, 2> features2D; cudaMallocPitch((void**)(&a ...
- POJ 1830 【高斯消元第一题】
首先...使用abs()等数学函数的时候,浮点数用#include<cmath>,其它用#include<cstdlib>. 概念: [矩阵的秩] 在线性代数中,一个矩阵A的列 ...
- poj 1363 Rails in PopPush City &&【求堆栈中合法出栈顺序次数】
问题如下: 问题 B: Rails 时间限制: Sec 内存限制: MB 提交: 解决: [提交][状态][讨论版] 题目描述 There is a famous railway station in ...
- Core dotnet 命令大全
Core dotnet 命令大全 dotnet 命令大全,让你理解dotnet 命令. 本文将以一个实例串起 dotnet 所有命令,让你玩转dotnet 命令. 本篇文章编写环境为windows 1 ...
- partial_sort_百度百科
partial_sort_百度百科 partial_sort
- stm32之ADC
将模拟量转换为数字量的过程称为模式(A/D)转换,完成这一转换的期间成为模数转换器(简称ADC);将数字量转换为模拟量的过程为数模(D/A)转换,完成这一转换的器件称为数模转换器(简称DAC). 模拟 ...
- fragment的切换
1.视图 1)主视图 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...
- Javascript DOM 01 基础篇
DOM基础 DOM是什么 答:文件对象模型(Document Object Model,简称DOM),DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构!来自网络 ...
- 02-UIKit控件、MVC
目录: 一.控件使用 二.动态类型和静态类型 三.MVC 四.UIAlertView对话框 回到顶部 一.控件使用 1 事件源,事件处理方法有一个参数传进来,那个参数就是触发这个事件的时间源. UIS ...