2009-12-24 31 views
1

假设我有物业B A类AInvoke方法

Class A { 
    public int b; 
} 

还有就是containes A级 ArrayList的山坳

我怎样才能得到一个实例集合数组col中所有属性b的值? 有没有比遍历col并获取每个对象的属性更优雅的方式,然后将b的值传递给数组?

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

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

回答

1

我认为你坚持以上。

也许Commons Collections可能会给你更可接受的东西。请参见CollectionUtils课程,特别是collect()forAllDo()方法。

另外,JXPath可以为你做到这一点(它提供了Java bean的类XPath导航)。您可以指定一个表达式,如/A/@b,它将返回一个b的集合。如果你这样做了一次,这有点过分,但如果你正在迭代并浏览集合,这是一个非常简洁的方法。

编辑:正如我在下面的评论中指出的,斯卡拉将以更简洁的形式做到这一点。如果您正在JVM上运行并进行大量类似上述的收集工作,则可能需要检查它。

0

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

2

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

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

+0

不正确。 Scala是键入的,并且会更简洁地完成上述* lot *操作。例如col.map {a => a.b}。这是键入并返回一个'b'集合 – 2009-12-24 16:49:40

+0

该片段没有类型信息 - 它的其余部分是什么样的? – danben 2009-12-24 16:51:46

+0

对不起,我打算说静态类型。总是混合起来。 – danben 2009-12-24 16:52:30

0

我结束了以下解决方案

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

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

许多thakns布莱恩·阿格纽的洞察力

2

使用LambdaJ

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

基本上LamdbaJ的想法是将功能语言中的所有漂亮的列表方法都用到Java中,然后它甚至可以将it's own version of closures添加到整个堆中。肯定值得检查。