0

私はGroovyの初心者です

これらは 2 つのeach呼び出しで、どちらも同様のタスクを実行しますが、 のプロパティが異なりますs2PublicLifecycleInstance

タスクを達成するためのメソッド呼び出しのみを持つことができるように、次のことを行う別の関数を作成するにはどうすればよいですか?

def scheduledStatusArray =[]
def publishedStatusArray =[]

s2PublicLifecycleInstance.each {
  if(it.scheduledInMyLearnStatus == "No"){
    scheduledStatusArray.add(1)
  } else if(it.scheduledInMyLearnStatus == "Yes"){
    scheduledStatusArray.add(2)
  }else{
    scheduledStatusArray.add(3)
  }
}

s2PublicLifecycleInstance.each {
  if(it.publishedOnTrainingClassesStatus == "No"){
    publishedStatusArray.add(1)
  }else if(it.publishedOnTrainingClassesStatus == "Yes"){
    publishedStatusArray.add(2)
  }else{
    publishedStatusArray.add(3)
  }
}

私はこのようなものが欲しい:

def publishedStatusArray = functionCall(s2PublicLifecycleInstance, propertyName)

Groovyで可能ですか?

4

4 に答える 4

2

クロージャーとカリー化を使用できます。

def checkStatus = { prop,instances ->
   def statuses = instances.collect {
      switch( it[prop] ) {
      case "Yes": 1
         break
      case "No": 2
         break
      default: 3
      }
   }
   return statuses
}

def checkScheduledStatus = checkStatus.curry("scheduledInMyLearnStatus")
def checkPublishedStatus = checkStatus.curry("publishedOnTrainingClassesStatus")

def scheduledStatusArray = checkScheduledStatus(s2PublicLifecycleInstance)
def publishedStatusArray = checkPublishedStatus(s2PublicLifecycleInstance)
于 2012-08-06T13:25:02.313 に答える
1

メソッドを使用して、このようにすることができます。

List check( List lifecycle, String param ) {
  lifecycle.collect { it ->
    switch( it."$param" ) {
      case "No":
        return 1
      case "Yes":
        return 2
      default:
        return 3
    }
  }
}

def scheduledStatusArray = check( s2PublicLifecycleInstance, 'scheduledInMyLearnStatus' )
def publishedStatusArray = check( s2PublicLifecycleInstance, 'publishedOnTrainingClassesStatus' )

または、これを行うこともできます (コードが少なくなります):

List check( List lifecycle, String param ) {
  def retvals = [ 'No':1, 'Yes':2 ].withDefault { 3 }
  lifecycle.collect { it ->
    retvals[ it."$param" ]
  }
}

別の代替手段は、複数の割り当てで注入を使用することです。

def (scheduledStatusArray, publishedStatusArray) = s2PublicLifecycleInstance.inject( [[],[]] ) { lists, it ->
  lists[ 0 ] << ( it.scheduledInMyLearnStatus == 'No' ? 1 :
                  it.scheduledInMyLearnStatus == 'Yes' ? 2 : 3 )
  lists[ 1 ] << ( it.publishedOnTrainingClassesStatus == 'No' ? 1 :
                  it.publishedOnTrainingClassesStatus == 'Yes' ? 2 : 3 )
  lists
}
于 2012-08-06T09:02:16.393 に答える
1
def myMethod(param, arrayToAdd) {
  if(param == "No"){
                arrayToAdd.add(1)
            }else if(param == "Yes"){
                arrayToAdd.add(2)
            }else{
                arrayToAdd.add(3)
            }
}


s2PublicLifecycleInstance.each {myMethod(it.scheduledInMyLearnStatus, scheduledStatusArray)}

s2PublicLifecycleInstance.each {myMethod(it.publishedOnTrainingClassesStatus, publishedStatusArray)}
于 2012-08-06T08:51:20.890 に答える
0

ガサンに同意します。追加できます、それ
def publishedStatusArray = functionCall(s2PublicLifecycleInstance, propertyName) はGroovyで可能です。関数:

functionCall(def s2PublicLifecycleInstance, String propertyName){ s2PublicLifecycleInstance."$propertyName" }

必要なプロパティを返します。

于 2012-08-06T09:06:43.063 に答える