假设我有一个
ArrayList<Fruit>
我想从任何给定的 Fruit 子类的列表中获取所有元素,例如
ArrayList<Apple>
C#似乎有一个比较好用的
OfType<T>()
方法。在 Java 中是否有等效的方法?
干杯
public static <T> Collection<T> ofType(Collection<? super T> col, Class<T> type) {
final List<T> ret = new ArrayList<T>();
for (Object o : col) if (type.isInstance(o)) ret.add((T)o);
return ret;
}
使用Guava,它只是
List<Apple> apples =
Lists.newArrayList(Iterables.filter(fruitList, Apple.class));
(披露:我为 Guava 做出了贡献。)
List<Fruit> list=new ArrayList<Fruit>();
//put some data in list here
List<Apple> sublist=new ArrayList<Apple>();
for (Fruit f:list)
if(f instanceof Apple)
sublist.add((Apple)f);
我们创建了一个名为 JLinq 的小实用程序来获得类似于 java 中 C# 中的 linq 的功能,其中一个类似于 typeof:
/**
* @param <T> the type of the list
* @param list the list to filter
* @param type the desired object type that we need from these list
* @return a new list containing only those object that from the given type
*/
public static <T> LinkedList<T> filter(LinkedList<T> list, Class<T> type) {
LinkedList<T> filtered = new LinkedList<T>();
for (T object : list) {
if (object.getClass().isAssignableFrom(type)) {
filtered.add(object);
}
}
return filtered;
}