Обнаружение первого и последнего элемента внутри Groovy each{} closure

я использую удобный MarkupBuilder Groovy для создания HTML-страницы из различных исходных данных.

одна вещь, которую я изо всех сил пытаюсь сделать красиво, это построить таблицу HTML и применить разные классы стилей к первой и последней строкам. Это, вероятно, лучше всего проиллюстрировать примером...

table() {
  thead() {
    tr(){
      th('class':'l name', 'name')
      th('class':'type', 'type')
      th('description')
    }
  }
  tbody() {
    // Add a row to the table for each item in myList
    myList.each {
      tr('class' : '????????') {
        td('class':'l name', it.name)
        td('class':'type', it.type)
        td(it.description)
      }
    }
  }   
}

на <tbody> раздел, я хотел бы установить класс <tr> элемент должен быть чем-то другим в зависимости от того, является ли текущий элемент в myList - первый или последний пункт.

есть ли хороший Заводной способ сделать это, не прибегая к чему-то ручному, чтобы проверить индексы элементов по размеру списка, используя что-то вроде eachWithIndex{}?

3 ответов


можно использовать

if(it == myList.first()) {
   // First element
}

if(it == myList.last()) {
   // Last element
}

ответ, предоставленный sbglasius, может привести к неправильному результату, например, когда список содержит избыточные элементы, поэтому элемент из списка может равняться последнему.

Я не уверен, что sbglasius может использовать is() вместо == но правильный ответ может быть :

myList.eachWithIndex{ elt, i ->
  if(i == 0) {
   // First element
  }

  if(i ==  myList.size()-1) {
   // Last element
  }
}

if (it.после.ценность != недействительный) { ...... }

работает для карт