在集合中调用每个bean的属性的方法

时间:2009-12-24 16:38:32

标签: java

假设我有一个属性为b的A类

Class A {
    public int b;
}

有一个包含A类实例的集合 ArrayList col

如何从col获取属性b的所有值的数组? 有没有比通过col迭代和获取每个对象的属性然后将b的值传递给数组更优雅的方法?

LIst<Integer> propertyValues = new ArrayList<Integer>();
for (A a : col){
    propertyValues.add(a.b);
}

也许是Spring实用工具方法或类似的东西?

5 个答案:

答案 0 :(得分:2)

为什么你不觉得这很优雅?几乎任何更短的东西都需要删除一些类型信息 - 通常你选择用Java编程,因为你想使用强类和静态类型的语言。

或许是因为它有大量的库和框架以及大量的Manning书籍,所有继承的遗留代码都是用Java编写的。不管。

答案 1 :(得分:2)

使用LambdaJ

List<Integer> bees = collect(originalList, on(A).b);

基本上,LamdbaJ的想法是将函数式语言中的所有漂亮列表方法都提供给Java,然后甚至将it's own version of closures添加到整个堆栈中。绝对值得一试。

答案 2 :(得分:1)

我认为你坚持以上。

也许Commons Collections可能会给你一些更可接受的东西。请参阅CollectionUtils课程,尤其是collect()forAllDo()方法。

或者,JXPath可以为您执行此操作(它提供类似于Java bean的类似XPath的导航)。您可以指定/A/@b等表达式,它将返回b的集合。如果你这样做一次有点过分,但如果你在集合上进行迭代和导航,那么这是一种非常简洁的方法。

编辑:正如我在下面的评论中指出的那样,Scala将以更简洁的形式完成此任务。如果您在JVM上运行并执行上述的大量收集工作,您可能需要查看它。

答案 3 :(得分:0)

我相信JDK集合框架没有比迭代解决方案更优雅的东西。

答案 4 :(得分:0)

我最终得到了以下解决方案

List propertyList = new ArrayList();
CollectionUtils.collect(list,new Transformer() {          
    @Override
    public Object transform(Object input) {
        return ((LogMessage)input).getLogRunIds();
    }
    },propertyList);

不幸的是,Transform界面不允许使用泛型,所以我必须使用显式强制转换

许多人向Brian Agnew表达了深刻见解