2009-12-24 3 views
1

Предположим, что у меня есть класс А с свойства бметод Invoke на имущество каждого бина в коллекции

Class A { 
    public int b; 
} 

Существует коллекция, containes экземпляры класса А ArrayList Col

Как я могу получить массив всех значений свойства b из col? Есть ли способ, более элегантный, чем итерация через col и получение свойства каждого объекта, а затем passign значения b для массива?

LIst<Integer> propertyValues = new ArrayList<Integer>(); 
for (A a : col){ 
    propertyValues.add(a.b); 
} 

Может быть, метод Spring полезности или что-то подобное?

ответ

1

Я думаю, что вы застряли над этим.

Возможно, Commons Collections может дать вам что-то более приемлемое. См. Класс CollectionUtils, и в частности методы collect() и forAllDo().

В качестве альтернативы JXPath может сделать это за вас (это обеспечивает XPath-подобную навигацию по Java-компонентам). Вы можете указать выражение, такое как /A/@b, и оно вернет коллекцию b. Это немного чрезмерно, если вы делаете это один раз, но если вы итерации и навигации по коллекциям, это очень краткий способ сделать это.

EDIT: Как я отметил в комментарии ниже, Scala сделает это в гораздо более сжатой форме. Если вы работаете на JVM и выполняете большую работу по сборке, как указано выше, вы можете проверить ее.

0

Я считаю, что рамки коллекций JDK не имеют ничего более элегантного, чем итерационное решение.

2

Почему вы не считаете это элегантным? Почти все, что короче, потребует удаления информации о типе - обычно вы выбираете программу на Java, потому что вы хотите использовать сильно и статически типизированный язык.

Или, может быть, потому, что у него есть множество библиотек и фреймворков, а также множество книг Manning и весь ваш унаследованный код устаревшего кода находится на Java. Без разницы.

+0

Неверно. Scala печатается и будет делать выше * много * более сжато. например col.map {a => a.b}. Это типизировано и возвращает коллекцию 'b' –

+0

Этот фрагмент не имеет информации о типе - как выглядит остальная часть? – danben

+0

Ах, извините, я хотел сказать статически типизированный. Всегда смешивайте их. – danben

0

Я кончался следующим раствором

List propertyList = new ArrayList(); 
CollectionUtils.collect(list,new Transformer() {   
    @Override 
    public Object transform(Object input) { 
     return ((LogMessage)input).getLogRunIds(); 
    } 
    },propertyList); 

К сожалению, Transform интерфейс не позволяет использовать дженерики, так что я должен использовать явное приведение

Многие thakns Брайану Agnew для понимания

2

Использование LambdaJ:

List<Integer> bees = collect(originalList, on(A).b); 

В основном идея LamdbaJ заключается в том, чтобы получить все превосходные методы списка, доступные на функциональных языках, на Java, а затем даже доходит до добавления it's own version of closures ко всей сваи. Определенно стоит проверить.

Смежные вопросы