假设我有一个属性为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实用工具方法或类似的东西?
答案 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
的集合。如果你这样做一次有点过分,但如果你在集合上进行迭代和导航,那么这是一种非常简洁的方法。
答案 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表达了深刻见解