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;"
}
}
我有一个迭代列表的 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;"
}
}