我有一个bean列表,想要获取值列表(给定一个特定的属性)。
例如,我有一个文档定义列表,我想获得一个代码列表:
List<DDocumentDef> childDefs = MDocumentDef.getChildDefinitions(document.getDocumentDef());
Collection<String> childCodes = new HashSet<String>();
for (DDocumentDef child : childDefs) {
childCodes.add(child.getCode());
}
还有更紧凑的解决方案吗?反思,匿名内部阶级......?
提前致谢
答案 0 :(得分:4)
我对你目前的做法感觉很好。
但是如果你想添加一个库(例如apache commons-collection和commons-beanutils)或者你已经添加了它,你可以这样做:
// create the transformer
BeanToPropertyValueTransformer transformer = new BeanToPropertyValueTransformer("code" );
// transform the Collection
Collection childCodes = CollectionUtils.collect( childDefs , transformer );
来自谷歌的Guava lib提供了类似的API。
答案 1 :(得分:3)
使用标准Java API没有其他方法可以做到这一点。但是,如果您感觉舒服,可以使用Guava's Lists.transform
方法:
Function<DDocumentDef, String> docToCodes =
new Function<DDocumentDef, String>() {
public String apply(DDocumentDef docDef) {
return docDef.getCode();
}
};
List<String> codes = Lists.transform(childDefs, docToCodes);
或者,等到Java 8结束,然后你可以使用lambdas和stream:
List<DDocumentDef> childDefs = ...
List<String> childCodes = childDefs.stream()
.map(docDef -> docDef.getCode())
.collect(Collectors.toCollection(HashSet::new));
现在由你决定,你喜欢哪一个,你认为哪一个更短。