web-dev-qa-db-ja.com

Groovyの各{}クロージャ内の最初と最後のアイテムを検出する

Groovyの便利なMarkupBuilderを使用して、さまざまなソースデータからHTMLページを作成しています。

私がうまくやるのに苦労していることの1つは、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>セクションで、myListの現在のアイテムが最初のアイテムであるか最後のアイテムであるかに応じて、<tr>要素のクラスを異なるものに設定したいと思います。

eachWithIndex{}のようなものを使用してリストサイズに対してアイテムインデックスをチェックするために手動で何かに頼ることなくこれを行うための素晴らしいGroovy化された方法はありますか?

29
tomtheguvnor

あなたが使うことができます

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

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

Sbglasiusによって提供される回答は、リストに冗長要素が含まれている場合など、誤った結果につながる可能性があるため、リスト内の要素が最後の要素と等しくなる可能性があります。

Sbglasiusが_==_の代わりにis()を使用できるかどうかはわかりませんが、正解は次のようになります。

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

  if(i ==  myList.size()-1) {
   // Last element
  }
}
_
13
Nouaman Harti

if(it.after.value!= null){......}

マップで動作します

1
John Allen