Еще одно решение «Groovy», в котором используется комбинация withIndex()
и findResults()
.
withIndex()
преобразует List<T>
в List<Tuple2<T,Integer>>
- список кортежей значений-индексов. findResults(closure)
выполняет преобразование фильтрации - полученное закрытие является преобразованиемсказуемое. В нашем случае он проверяет, является ли значение индекса нечетным или четным, и извлекает значение из кортежа, если предикат соответствует. (Все null
значения отфильтрованы.)
Кратко и кратко. Требуется минимальное количество преобразований: от List<T>
до List<Tuple2<T,Integer>>
, а затем одна итерация для получения окончательного результата.
def numbers = [1,2,3,4,5,6,2,3,1] // Some test data
def even = { t -> t.second % 2 == 0 ? t.first : null } // "Even" transforming predicate
def odd = { t -> t.second % 2 == 1 ? t.first : null } // "Odd" transforming predicate
def evens = numbers.withIndex(1).findResults even
def odds = numbers.withIndex(1).findResults odd
// And some assertions to test the implementation
assert evens == [2,4,6,3]
assert odds == [1,3,5,2,1]