2011-12-16 51 views
1

的模式如何調用這個模式,是對此有任何現有的Apache的公共實用程序:關於收集訪問者轉化

class Person { 
    String getName(); 
} 

List<Person> persons = ...; 

// create a dynamic bean on the fly, which can be used as: 
Object personXxxx = transformListOfBeans(Person.class, persons); 
// so each of the bean properties now returns the list of the original property: 
List<String> personNames = personXxxx.name; 

// i.e. the transformation creates a new "type": 
class PersonXxxx { 
    List<String> getName(); 
} 

如何把這種轉變的?代理應該保留方法簽名。所以它不是代理人,也不是裝飾者。

好吧,我可以簡單地生成的屬性名稱重命名爲複數形式,如:

personXxxx.names 

這是沒有問題的。我想知道這種模式是否已經知道,所以我不必親自選擇合適的詞語。

+0

我覺得這個解釋是不夠的。你能再詳細一點嗎? – 2011-12-16 15:10:26

+0

@gurung:查看更改。 – 2011-12-16 15:16:51

+0

我認爲他想要一種方式來獲得不是一個人名單,但他們的名單,他們的年齡列表等我不知道一個很好的,一般的方式來做到這一點。 – user949300 2011-12-16 15:20:53

回答

1

我不認爲這是一種工具。 你必須編寫它:

List<String> names = new ArrayList<String>(persons.size()); 
for (Person person : persons) { 
    names.add(person.getName()); 
} 

也許你可以使用內省更通用的,但代碼是非常簡單的。

0

一種可能性是爲所有方法聲明一個接口,例如, (爲了清晰起見,導致我)INamable,IAgeable,ISexable等演員表the List<Person> to List<ISomething>.顯然這有問題。

1

我不認爲有這樣的模式,但番石榴提供了一個簡單的方法將一個集合轉換爲另一個。例如:

List<Person> persons = ...; 
Iterable<String> names = Iterables.transform(persons, new Function<Person, String>() { 
    @Override 
    public String apply(Person person) { 
     return person.getName(); 
    } 
});