我写了这个实用函数:
我的问题在于,如果调用者类型错误,直到调用者尝试从列表中获取对象时才会抛出异常。理想情况下,我希望从
有什么技巧可以确保调用者不会得到无效的列表吗?
public static <T> List<T> pluck(String fieldName, List list)
throws NoSuchFieldException, IllegalAccessException {
if (list.isEmpty()) {
return new ArrayList<T>();
}
Class c = list.get(0).getClass();
Field f = c.getField(fieldName);
ArrayList<T> result = Lists.newArrayList();
for (Object object : list) {
result.add((T) f.get(object));
}
return result;
}
我从underscore.js中借鉴了这个想法。使用情况是:
ArrayList<Person> people = new ArrayList<Person>;
people.add(new Person("Alice", "Applebee"));
people.add(new Person("Bob", "Bedmington"));
people.add(new Person("Charlie", "Chang"));
List<String> firstNames = pluck("firstName", people);
我的问题在于,如果调用者类型错误,直到调用者尝试从列表中获取对象时才会抛出异常。理想情况下,我希望从
pluck
方法本身抛出ClassCastException
。但是,我看不到在运行时访问列表类型的方法。有什么技巧可以确保调用者不会得到无效的列表吗?
编辑:所以根据我收到的反馈,一个安全的实现方法是:
public static <T,F> List<F> pluck(String fieldName, Class<F> fieldType,
List<T> list, Class<T> listType)
throws NoSuchFieldException, IllegalAccessException {
Field f = listType.getField(fieldName);
ArrayList<F> result = new ArrayList<F>();
for (T element : list) {
result.add(fieldType.cast(f.get(element)));
}
return result;
}
但实际上,lambdaj似乎已经做到了我想要的,所以我想我会使用它。谢谢Mike!
免责声明:LambdaJ(@GoogleCode | @GitHub)-自JDK8发布(JSR 335,JEP 126)以来,此项目不再维护。
list.get(0).getClass()
可能无法获取正确的类。如果list.get(0)
为空,它将会崩溃。此外,list
的后续元素可能不是list.get(0)
类的实例。 - newacct