2017-04-19 77 views
0

我知道Java,但對Groovy來說是全新的。 Groovy中有一些遺留代碼可供使用。Groovy每個關閉錯誤

我有以下方法在Groovy:

def notificationPrefsByFruit = mapMyNotificationsByFruits(prefs, fruits) 

當我mapMyNotificationsByFruits方法在第一線調試,我得到prefs

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 
} 

以上方法會從如下的另一種方法叫做

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實例的列表。但它fruitId分組的MyNotification實例。

鑑於

[ 
    [ 
     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變量上的每個方法,因此它是 期望前綴爲List<MainNotification>而不是 MainNotification
  • 在嵌套關閉此代碼:cn.fruits.each期待每個 水果是MyNotification實例(這是主要的修復您 問題順便說一句)。

所以每個輸入數據,你給你的問題,你沒有張貼MainNotification和源代碼MyNotification我模仿他們是這樣的:

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