2014-11-21 5 views
1

Я изучаю Groovy, и я пытаюсь написать альтернативу следующему бит кода Java.Groovy filtering array с методом findAll

Collection<Record> records = requestHelper.getUnmatchedRecords(); 
Collection<Integer> recordIdentifiers = new ArrayList<>(); 
for (Record record : records){ 
    int rowId = record.getValue("RowID"); 
    if (rowId >= min && rowId <= max) { 
     recordIdentifiers.add(rowId); 
    } 
} 

Когда этот бит кода запускается, идентификаторы записи должны содержать 50 элементов. До сих пор это мой эквивалент Groovy.

def records = requestHelper.getUnmatchedRecords() 
def recordIdentifiers = records.findAll{record -> 
    int rowId = record.getValue("RowId") 
    rowId >= min && rowId <= max 
} 

По какой-то причине массив содержит 100 элементов после выполнения кода Groovy. Все примеры findAll(), с которыми я столкнулся, делают простые сравнения, когда массив построен изначально в Groovy, но как вы фильтруете коллекцию, которую вы получаете из класса Java?

+0

Что такое 100 и 50 здесь? сколько их в «записях»? фильтр просто не работает или есть дубликаты в 'recordIdentifiers'? На первый взгляд код выглядит нормально. – cfrick

+1

Как я узнал позже, мой код был в порядке, но один из наших младших разработчиков создал неправильный набор данных для меня, чтобы работать с ним - у него были дубликаты, поэтому вместо 50 записей у меня было 100. Теперь его пристыдили. – user283188

ответ

2

Кажется странным. Следующий код работает нормально:

def records = [[r:3],[r:5],[r:6],[r:11],[r:10]] 
def range = (1..10) 
recordIdentifiers = records.findAll { range.contains(it.r) } 
assert recordIdentifiers.size() == 4 

Не могли бы вы представить рабочий пример?

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