检查ArrayList中是否包含对象的实例

9
我有一个Java方法,需要检查ArrayList中是否包含给定类的实例。我需要将要检查的类的类型作为参数传递给该方法,如果列表包含给定类型的对象,则返回它。这可行吗?
5个回答

19
public static <T> T find(Collection<?> arrayList, Class<T> clazz)
{
    for(Object o : arrayList)
    {
        if (o != null && o.getClass() == clazz)
        {
            return clazz.cast(o);
        }
    }

    return null;    
}

并且调用

String match = find(myArrayList, String.class);

3
处理子类可以使用 Class.isAssignableFrom 方法,方法应该接受 Collection 而非 ArrayList(即使用接口编程)。此外,建议遵循 Java 推荐的代码规范,将方法名以小写字母开头。 - Steve Kuo
@Steve Kuo:或者Class.isInstance - user102008

5
public static <T> T getFirstElementOfTypeIn( List<?> list, Class<T> clazz )
{
  for ( Object o : list )
  {
    if ( clazz.isAssignableFrom( o.getClass() ) )
    {
      return clazz.cast( o );
    }
  }
  return null;
}

clazz.isAssignableFrom( o.getClass() ) 可以写成 clazz.isInstance( o ) - user102008

1
如果您正在使用Java 8,可以这样做:

public <T> Optional<T> getInstanceOf(Class<T> clazz, Collection<?> collection) {
    return (Optional<T>) collection.stream()
            .filter(e -> clazz.isInstance(e.getClass()))
            .findFirst();
}

如果您以前从未使用过 Optional,请查阅文档。实际上,这比 返回 null 更好的做法。


0
你可以遍历列表并测试每个元素。
Class<?> zz = String.class;
for (Object obj : list) {
    if (zz.isInstance(obj)) {
        System.out.println("Yes it is a string");
    }
}

请注意,isInstance也会捕获子类。否则,请参见Bela的答案。

这个回答被踩了,但似乎是更好的解决方案,特别是当你不关心类或子类的情况下;就像我的情况一样,正如帖子所解释的那样。那么为什么会被踩呢?如果没有好的解释,我会点赞的。 - Toby Wilson

0

检查列表中的一个项目实例

if (object instanceof ArrayList<?>) {
                        if (((ArrayList<?>) object).get(0) instanceof ClassA) {
                            classAList= (ArrayList<ClassA>) object;
                        } else if (((ArrayList<?>) object).get(0) instanceof ClassB) {
                            classBList= (ArrayList<classB>) object;
                        } else if (((ArrayList<?>) object).get(0) instanceof ClassC) {
                            classCList= (ArrayList<ClassC>) object;
                        }
                    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接