2017-04-19 8 views
0

私はJavaを知っていますが、Groovyは全く新しいです。 Groovyにいくつかのレガシーコードがあります。Groovy closure error

私はGroovyでメソッドの下にあります。上記の方法

def mapMyNotificationsByFruits(prefs,fruits) { 
    def map = [:] 
    prefs.each { MainNotification cn -> 
     cn.fruits.each { 
      MyNotification an -> 
      def ex = map[(an.fruitId)] 
      if (!ex) ex = [] 
      ex.add(an) 
      map[(an.fruitId)] = ex 
     } 
    } 
    log.info("map is: $map") 
    return map 
} 

は、以下のように別のメソッドから呼び出されます:

def notificationPrefsByFruit = mapMyNotificationsByFruits(prefs, fruits) 

私はmapMyNotificationsByFruits方法で最初の行にデバッグするとき、私は

として prefsを取得
MainNotification [someId=ABC123, [email protected], fruits=[{fruitId=XYZ123, someField=0}]] 

このコードを実行すると、次のエラーが表示されます。

groovy.lang.MissingMethodException: No signature of method: com.somepackage.SomeClass$_mapMyNotificationsByFruits_closure5$_closure10.doCall() is applicable for argument types: (groovy.json.internal.LazyMap) values: [[{fruitId=XYZ123, someField=0}]] 

ここで何が間違っていますか?

これらの行は何をするのか:

MyNotification an -> 
     def ex = map[(an.fruitId)] 
     if (!ex) ex = [] 
     ex.add(an) 
     map[(an.fruitId)] = ex 

は、それが鋳造の問題ですか?以下のコードを持つ行の上の交換

は問題が解決されます。

MyNotification an = it 
def ex = map[(an.fruitId)] 
if (!ex) ex = [] 
ex.add(an) 
map[(an.fruitId)] = ex 

をしかし、私は、両方のコードブロックが同じであると、私はそれを正しく固定していますかどうかわからないです。

ありがとうございます!

+0

入力と予測出力は何ですか? – Rao

+0

あなたは十分な情報を提供していませんが、問題を解決しようとしました。 – dsharew

答えて

0

アルゴリズムは何をしますか?
MainNotificationインスタンスのリストでは、MyNotificationインスタンスをfruitIdでグループ化しています。

考える

[ 
    [ 
     someId: "ABC123", 
     email: "[email protected]", 
     fruits: [ 
      [fruitId : "XYZ123", someField: 0], 
      [fruitId : "XYZ124", someField: 6], 
     ] 
    ], 

    [ 
     someId: "XYSK", 
     email: "[email protected]", 
     fruits: [ 
      [fruitId : "XYZ123", someField: 5], 
      [fruitId : "XYZ124", someField: 2], 
      [fruitId : "XYZ144", someField: 9], 
     ] 
    ] 
] 

予想される出力:

[ 
    XYZ123 : [ 
      [fruitId : "XYZ123", someField: 0], 
      [fruitId : "XYZ123", someField: 5] 
     ], 
    XYZ124 : [ 
      [fruitId : "XYZ124", someField: 6], 
      [fruitId : "XYZ124", someField: 2] 
     ], 
    XYZ144 : [ 
      [fruitId : "XYZ144", someField: 9] 
     ] 
] 

訂正:変数は、メソッドで使用されることはありません

  • 果物ので、それを取り除いてください。
  • このメソッドは、prefs変数の各メソッドを呼び出すため、 MainNotificationの代わりにList<MainNotification>となるように、 があります。ネストされたクロージャで
  • このコード:cn.fruits.eachは各 果実は(これはところで、あなたの 問題に主な修正です)MyNotificationのインスタンスであることを期待しています。

私はこのようにそれらをモデル化し、あなたの質問に与えた入力データごとのように、あなたはMainNotificationMyNotificationのソースコードを投稿できませんでした:修正と仮定して

class MainNotification{ 
    String someId; 
    String email; 
    List<MyNotification> fruits; 
} 

class MyNotification{ 
    String fruitId; 
    int someField; 
} 

をここで作業コードがあります:

def mapMyNotificationsByFruits(prefs,fruits) { 
    def map = [:] 
    prefs.each { MainNotification cn -> 
     cn.fruits.each { MyNotification an -> 
      def ex = map[(an.fruitId)] 
      if (!ex) ex = [] 
      ex.add(an) 
      map[(an.fruitId)] = ex 
     } 
    } 
    println ("map is: $map") 
    return map 
} 

MainNotification mainNotification = new MainNotification(someId: "ABC123", 
     email: "[email protected]", 
     fruits: [new MyNotification(fruitId : "XYZ123", someField: 0)] 
); 

MyNotification fruits = null; //never used on the method 

List<MainNotification> prefs = [mainNotification]; 

def notificationPrefsByFruit = mapMyNotificationsByFruits(prefs, fruits) 
+1

私の質問の終わりの置換コードは、前のコードと同じです..右ですか?私はMyNotificationとして「それ」をキャストしているので。それが正しいか ? – Nik

+0

ええ、申し訳ありませんが、同じ効果が得られるはずです。 – dsharew

+0

ご協力いただきありがとうございます! – Nik