Harshal Parekh:
Tengo un JSONArray (org.json) así:
[
{ "a": "a" },
{ "b": "a" },
{ "c": "a" },
{ "d": "a" },
{ "e": "a" },
{ "f": "a" },
{ "g": "a" }
]
Me gustaría eliminar todos los JSONObject
s que no tienen la clave a
. ¿Hay una mejor manera de hacerlo que no sea mi enfoque ingenuo?
Iterator objects = jsonArray.iterator();
while (objects.hasNext()) {
Object o = objects.next();
if (o instanceof JSONObject && !((JSONObject) o).has("a")) {
objects.remove();
}
}
Rendimiento esperado:
[{"a": "a"}]
ETO:
Si usted está buscando una solución de estilo funcional, se puede envolver el Iterator
en una Stream
y luego hacer lo que quiera.
Una de las soluciones funcionales:
JSONArray newJsonArray =
StreamSupport.stream(jsonArray.spliterator(), false)
.filter(JSONObject.class::isInstance)
.map(JSONObject.class::cast)
.filter(j -> j.has("a"))
.collect(collectingAndThen(toList(), JSONArray::new));
Nota : La solución anterior no modifica el original JSONArray
. Siguiendo los principios de una programación funcional debe preferir recoger en un nuevo objeto en vez de modificar el existente.