Вызвать метод для свойства каждого компонента в коллекции - PullRequest
1 голос
/ 24 декабря 2009

Предположим, у меня есть класс A со свойством b

Class A {
    public int b;
}

Существует коллекция, которая содержит экземпляры класса A ArrayList col

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

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

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

Ответы [ 5 ]

2 голосов
/ 25 декабря 2009

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

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

По сути, идея LamdbaJ состоит в том, чтобы получить все изящные методы списка, доступные на функциональных языках, для Java, а затем даже добавить свою собственную версию замыканий ко всей куче. Определенно стоит проверить.

2 голосов
/ 24 декабря 2009

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

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

1 голос
/ 24 декабря 2009

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

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

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

РЕДАКТИРОВАТЬ: Как я указал в комментарии ниже, Scala сделает это в гораздо более сжатой форме. Если вы работаете на JVM и выполняете много работы по сбору, как описано выше, вы можете проверить это.

0 голосов
/ 25 декабря 2009

Я получил следующее решение

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

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

Большое спасибо Брайану Агнью за понимание

0 голосов
/ 24 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...