Java 集合中对象的Collect属性
在C中,我可以这样做:Java 集合中对象的Collect属性,java,collections,properties,Java,Collections,Properties,在C中,我可以这样做: IEnumerable<long> ids = things.select(x => x.Id); 在Java中,我必须这样做: Collection<Long> ids = new ArrayList<Long>(things.size()); for(Thing x : things) ids.add(x.getId()); Set ids = things.collect{ aThing -> aThing.
IEnumerable<long> ids = things.select(x => x.Id);
在Java中,我必须这样做:
Collection<Long> ids = new ArrayList<Long>(things.size());
for(Thing x : things)
ids.add(x.getId());
Set ids = things.collect{ aThing -> aThing.Id}
我现在不得不做很多这类事情,并且想知道是否有一种更通用的方法在Java中实现这一点。可以创建一个方法来完成,但是我必须添加一个带有getId方法的接口或者类似的东西。。。我不能…。在Groovy中,您只需执行以下操作:
Collection<Long> ids = new ArrayList<Long>(things.size());
for(Thing x : things)
ids.add(x.getId());
Set ids = things.collect{ aThing -> aThing.Id}
这将为您提供作为列表的所有内容中的所有ID
这里有一些,还有一些你可以试试这个方法。它接受一个集合、一个来自反射api的方法和一个目标类。它对集合的所有成员调用该方法,并返回结果列表
public <T> Collection<T> select(Collection<? extends Object> input, Method getter, Class<T> targetClazz) {
ArrayList<T> result = new ArrayList<T>();
for (Object object : input) {
try {
Object resultObject = getter.invoke(object, (Object[]) null);
if (targetClazz.isAssignableFrom(resultObject.getClass())) {
result.add(targetClazz.cast(resultObject));
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return result;
}
我暂时忽略了正确的错误处理。用法:
try {
Method getId = Thing.class.getMethod("getId", null);
Collection<Long> result = select(things, getId, Long.class);
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
这不是一个真正的答案,但您可以等待Java8,它将支持lambda表达式。除此之外,我认为番石榴是您最好的选择。使用,特别是: 调用方式如下,其中transform是从guava的静态导入:
Collection<Long> ids = transform(things, new ThingFunction());
番石榴也有不少。使用“小坚果和精选品:
Collection<Long> ids = CollectionUtils.collect(things,
new BeanToPropertyValueTransformer("id"));
我假设事物不是从集合或数组继承的。为什么要这样假设?我循环使用for,所以至少必须是数组或iterable。@Brett Walker需要一个ID集合,而不是另一个ID集合things@Brett我不想要另一个东西的集合,我想要一个东西的某个属性的值的集合,在本例中,您希望如何处理这些属性集合。旁白:-未说明该类型。考虑到更大的环境,具体的问题可能会提供不同的解决方案。但以Java的速度,这可能需要几十年的时间:pit的日程安排在2012年10月,所以它就在角落里;但那并不意味着我到时候就能用它了,呵呵。在我目前工作的组织中,仍然使用1.6版本…java 8 lambda expressions 2014和计数