ElasticSearch/Painless: 如何在迭代时跳过一个项目?

ElasticSearch/Painless: How do I skip an item when iterating?

我有一个迭代列表的 for 循环。如果列表包含某个值,比如“5”,我希望循环 skip 该值。但是 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; } }" 
  }
}

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

您可以通过使用 Java 8 lambda 在列表的副本上调用 removeIf 来实现此目的:

"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;" 
  }
}