如何找出每个对象在ArrayList <Object>中的types?
我有一个ArrayList由从db导入的不同元素组成,由string,数字,双精度和整数组成。 有没有办法使用reflectiontypes技术来找出每个元素的每种types的数据?
仅供参考:有这么多types的数据的原因是,这是一个Java代码被写入用不同的数据库来实现。
在C#中:
修正了Mike的build议
ArrayList list = ...; // List<object> list = ...; foreach (object o in list) { if (o is int) { HandleInt((int)o); } else if (o is string) { HandleString((string)o); } ... }
在Java中:
ArrayList<Object> list = ...; for (Object o : list) { if (o instanceof Integer)) { handleInt((int)o); } else if (o instanceof String)) { handleString((String)o); } ... }
您可以使用getClass()
方法,也可以使用instanceof。 例如
for (Object obj : list) { if (obj instanceof String) { ... } }
要么
for (Object obj : list) { if (obj.getClass().equals(String.class)) { ... } }
请注意,instanceof将匹配子类。 例如, C
是A
一个子类,那么下面是真的:
C c = new C(); assert c instanceof A;
但是,以下将是错误的:
C c = new C(); assert !c.getClass().equals(A.class)
for (Object object : list) { System.out.println(object.getClass().getName()); }
你几乎不希望你使用类似于:
Object o = ... if (o.getClass().equals(Foo.class)) { ... }
因为你没有考虑到可能的子类。 你真的想要使用Class#isAssignableFrom:
Object o = ... if (Foo.class.isAssignableFrom(o)) { ... }
在Java中只使用instanceof操作符。 这也将照顾子类。
ArrayList<Object> listOfObjects = new ArrayList<Object>(); for(Object obj: listOfObjects){ if(obj instanceof String){ }else if(obj instanceof Integer){ }etc... }
import java.util.ArrayList; /** * @author potter * */ public class storeAny { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Object> anyTy=new ArrayList<Object>(); anyTy.add(new Integer(1)); anyTy.add(new String("Jesus")); anyTy.add(new Double(12.88)); anyTy.add(new Double(12.89)); anyTy.add(new Double(12.84)); anyTy.add(new Double(12.82)); for (Object o : anyTy) { if(o instanceof String){ System.out.println(o.toString()); } else if(o instanceof Integer) { System.out.println(o.toString()); } else if(o instanceof Double) { System.out.println(o.toString()); } } } }
只需在循环中的每个Object
上调用.getClass()
。
不幸的是,Java没有map()
。 🙂
如果你不依赖于特定的类,Instanceof可以工作,但是也要记住,你可以在列表中有空值,所以obj.getClass()会失败,但是instanceof总是返回null。
自Java 8以来
mixedArrayList.forEach((o) -> { String type = o.getClass().getSimpleName(); switch (type) { case "String": // treat as a String break; case "Integer": // treat as an int break; case "Double": // treat as a double break; ... default: // whatever } });
而不是使用object.getClass().getName()
你可以使用object.getClass().getSimpleName()
,因为它返回一个简单的类名,而不包括包名。
例如,
Object[] intArray = { 1 }; for (Object object : intArray) { System.out.println(object.getClass().getName()); System.out.println(object.getClass().getSimpleName()); }
给,
java.lang.Integer Integer
你说“这是一段正在编写的java代码”,从中我推断你仍然有机会以不同的方式devise它。
有一个ArrayList就像有一个东西的集合。 每次从列表中取出对象时,不要强制instanceof或getClass,为什么不devise系统,以便在从数据库检索对象时获取对象的types,并将其存储到适当types的目的?
或者,您可以使用存在的许多数据访问库之一为您执行此操作。
如果你期望数据是某种forms的数字,而你所感兴趣的是将结果转换为数值,我会build议:
for (Object o:list) { Double.parseDouble(o.toString); }