1

我有一个 bean 列表,并且想要获取一个值列表(给定一个特定属性)。

例如,我有一个文档定义列表,我想获得一个代码列表:

List<DDocumentDef> childDefs = MDocumentDef.getChildDefinitions(document.getDocumentDef());
Collection<String> childCodes = new HashSet<String>();
for (DDocumentDef child : childDefs) {
    childCodes.add(child.getCode());
}

有没有更紧凑的解决方案?反射,匿名内部类......?

提前致谢

4

2 回答 2

4

我对你目前的做法感觉很好。

但是如果你想添加一个库(例如 apache commons-collection 和 commons-beanutils)或者你已经添加了它,你可以这样做:

// create the transformer
BeanToPropertyValueTransformer transformer = new BeanToPropertyValueTransformer("code" );

// transform the Collection
Collection childCodes = CollectionUtils.collect( childDefs , transformer );

google的Guava lib 提供了类似的 api。

于 2013-10-24T10:42:26.783 回答
3

使用标准 Java API 没有其他方法可以做到这一点。但是,如果你觉得舒服,你可以使用Guava 的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 发布后,您可以为此使用 lambda 和流:

List<DDocumentDef> childDefs = ...

List<String> childCodes = childDefs.stream()
                               .map(docDef -> docDef.getCode())
                               .collect(Collectors.toCollection(HashSet::new));

现在由您决定,您更喜欢哪一个,以及您认为哪一个更短。

于 2013-10-24T10:42:09.533 回答