2016-08-25 3 views
1

これは最良の質問ではないかもしれませんが、何が起こっているのか不思議です。Groovy addAllはリストのリストを作成します

私はグルーヴィー

def markets = [] 
for (int i = 0; i < marketIds.size(); i += 200) { 
    int from = i 
    int to = (i + 200) > marketIds.size() ? marketIds.size() : (i + 200) 
    markets.addAll(service.getMarketCatalog(args...)) 
} 

markets 

service.getMarketCatalog()にコードのこの部分を持っているが、それは彼らのAPIで定義されたいくつかのオブジェクトのリストを返す第3部のAPIを呼び出します(オブジェクト/マップのリストを返します。私たちは、それらを得ますマップとして)。

この方法の結果は、市場がリストのリストであることが原因です。 forループが3回実行され、APIが毎回リストに応答すると、リストはオブジェクトとして市場に追加されます。

誰もが何らかのアイデアを持っていますか?たぶん結果がリスト(つまりservice.getMarketCatalog(args...) as List)であると定義しなければならないかもしれません。それ以外の場合はオブジェクトとして扱われ、オブジェクトとしてリストに追加されますか?

+3

'getMarketCatalog'は何を正確に返しますか?試してみるという例がありますか? –

答えて

2

私自身のテストから判断すると...

Object x() { return [1, 2] } 
def y = [] 
y.addAll(x()) 
y.addAll(x()) 
println y 

Result: [1, 2, 1, 2] 

...どんなにservice.getMarketCatalog()の戻り値の型は、値が真にリストや他のコレクションであるならば、それだけで、その後、オブジェクトの場合でも、何ですかaddAllは予期した動作をします。 IDEで警告が表示されますが、Groovyは明らかに実行時にObjectをCollectionにキャストしようとして成功します。

このように私は、service.getMarketCatalog()は実際には信じられているように単一レベルのリストを返さないと結論付けることができます。リスト自体のリストでなければなりません。本当にそうであるかどうかを調査する必要があります。そうであれば、トップレベルのリストを各サブリストに追加することができます:markets.addAll(*service.getMarketCatalog(args...))

関連する問題