2013-10-24 104 views
0

我有一個bean列表並想獲取值列表(給定一個特定的屬性)。從豆列表中獲取屬性值列表

舉例來說,我的文檔定義列表,我想要得到的代碼列表:

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

是否有更緊湊的解決方案?反思,匿名內部類......?

在此先感謝

+0

目前的方法有什麼問題? –

+0

沒有錯,只是尋找一個簡短的/緊湊的解決方案 –

+0

我認爲沒有,但你可以嘗試寫一個通用的方法,它使用反射自己讀取bean域。這不是很困難,但可能會有性能問題。 –

回答

2

有沒有其他辦法與標準的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出來,然後你可以使用lambda表達式,爲此流:

List<DDocumentDef> childDefs = ... 

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

現在是高達你決定,你更喜歡哪一個,你認爲哪一個更短。

4

我對你目前的做法感覺很好。

但是,如果你想添加一個庫(如Apache的百科全書收集和commons-BeanUtils的),或者你已經添加它,你可以這樣來做:

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

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

從谷歌Guava LIB提供一個類似的API。

+0

非常好的例子!非常適合我,謝謝;) –