0

我有一个迭代列表的 for 循环。如果列表包含某个值,例如“5”,我希望循环跳过该值。但是 Painless 似乎决定不允许我使用空的 if 块或使用 continue 语句。我怎样才能做到这一点?

"script_fields": {
"HResultCount": {
  "script": {
    "lang": "painless",
    "inline": "int instance = 0; for (int i = 0; i < doc['numbers'].length; ++i) { if (doc['numbers'] == '5') { /* bail out */ } else { return 1.0; } }" 
  }
}
4

1 回答 1

2

由于脚本在所有情况下都必须返回一个值,因此您可以在按照您的建议进行迭代之前从列表中删除值 5。

您可以通过removeIf使用 Java 8 lambda 调用列表的副本来实现这一点:

"script_fields": {
"HResultCount": {
  "script": {
    "lang": "painless",
    "inline": "int instance = 0; List copy = new ArrayList(doc['numbers']); copy.removeIf(i -> i == 5); for (int i = 0; i < copy.length; ++i) { instance += copy[i]; } return instance;" 
  }
}
于 2017-07-20T05:30:46.467 回答