Java 集合中对象的Collect属性

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.

在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.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和计数