Tengo un mapa para recorrer, y quiero comprobar los valores de entrySet con dos condiciones; si se cumple la condición 1, el grupo I en una colección, findFirst()
y obtener el Optional<>
, si no, filtro con otra condición y recoger a otra colección, hacer lo mismo.
Lo hice con for
bucles en una iteración. Ahora, si quiero iterate una sola vez con Java 8 corriente, ¿es posible?
He tratado con stream().filter(cond1).map(Map.Entry::getValue).findFirst()
(iterate dos veces).
También comprobé groupingBy()
y partitionBy()
pero no he visto la posibilidad todavía.
Ejemplo de enfoque 1:
for (Map.Entry<String, Response> entry: responses.entrySet()) {
String key = entry.getKey();
Response value = entry.getValue();
if (key.equals("foo") && !value.equals("bar")) {
res1 = value;
} else if (key.equals("some other key")) {
res2 = value;
}
}
Response finalResponse = res1 != null ? res1 : res2;
Ejemplo de enfoque 2:
Optional<Response> res1 = Optional.empty();
Response res2;
res1 = responses.entrySet().stream()
.filter(entry -> entry.getKey().equals("foo") &&
!entry.getValue().equals("bar"))
.map(Map.Entry::getValue)
.findFirst();
res2 = responses.entrySet().stream()
.filter(entry -> entry.getKey().equals("some other key"))
.map(Map.Entry::getValue)
.findFirst().orElse(null);
Response finalResponse = res1.orElse(res2);
Si su condición es sólo sobre la base .equals()
de una clave y valor, al igual que usted está mostrando en su pregunta, sólo puede utilizar map.get()
y un simple if
afirmación:
Response result = responses.get("foo");
if (result == null || result.equals(bar))
result = responses.get("some other key");
Así que no hay necesidad de usar cualquier otra cosa.
O como Holger sugiere que puede usar alternativamente map.getOrDefault()
:
Response result = responses.getOrDefault("foo", bar);
if(result.equals(bar))
result = responses.get("some other key");