flujo de Java - aplicar dos filtros y recoger a dos colecciones en una iteración

WesternGun:

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 forbucles 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);
Samuel Philipp:

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 ifafirmació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");

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=332257&siteId=1
Recomendado
Clasificación