example and java hashmap java-8 collectors

and - Hashmap con Streams en Java 8 Streams para recopilar el valor de Map



map stream java (4)

Lo que debe hacer es crear un Stream del .entrySet() ''s .entrySet() :

// Map<K, V> --> Set<Map.Entry<K, V>> --> Stream<Map.Entry<K, V>> map.entrySet().stream()

Desde el .filter() , puede .filter() sobre estas entradas. Por ejemplo:

// Stream<Map.Entry<K, V>> --> Stream<Map.Entry<K, V>> .filter(entry -> entry.getKey() == 1)

Y para obtener los valores del mismo, usted .map() :

// Stream<Map.Entry<K, V>> --> Stream<V> .map(Map.Entry::getValue)

Finalmente, debe recopilar en una List :

// Stream<V> --> List<V> .collect(Collectors.toList())

Si solo tiene una entrada, utilícela en su lugar (NOTA: este código supone que hay un valor; de lo contrario, use .orElse() ; consulte el javadoc de Optional para obtener más detalles):

// Stream<V> --> Optional<V> --> V .findFirst().get()

Consideremos un hashmap

Map<Integer, List> id1 = new HashMap<Integer,List>();

Inserté algunos valores en ambos hashmap.

Por ejemplo,

List<String> list1 = new ArrayList<String>(); list1.add("r1"); list1.add("r4"); List<String> list2 = new ArrayList<String>(); list2.add("r2"); list2.add("r5"); List<String> list3 = new ArrayList<String>(); list3.add("r3"); list3.add("r6"); id1.put(1,list1); id1.put(2,list2); id1.put(3,list3); id1.put(10,list2); id1.put(15,list3);

Q1) Ahora quiero aplicar una condición de filtro en la clave en hashmap y recuperar el valor correspondiente (Lista).

Ejemplo: aquí Mi consulta es clave = 1, y la salida debe ser ''lista1''

escribí

id1.entrySet().stream().filter( e -> e.getKey() == 1);

Pero no sé cómo recuperarlo como una lista como salida de esta operación de transmisión.

P2) Nuevamente quiero aplicar una condición de filtro en la clave en hashmap y recuperar la lista correspondiente de listas.

Por ejemplo: Aquí Mi consulta es clave = 1% (es decir, la clave puede ser 1,10,15), y la salida debe ser ''lista1'', ''lista2'', ''lista3'' (lista de listas).


Para su Q2, ya hay respuestas a su pregunta. Para su Q1, y más generalmente cuando sabe que el filtrado de la clave debe dar un valor único, no es necesario usar Streams en absoluto.

Simplemente use get o getOrDefault , es decir:

List<String> list1 = id1.getOrDefault(1, Collections.emptyList());


Si está seguro de que obtendrá como máximo un único elemento que pasó el filtro (que está garantizado por su filtro), puede utilizar findFirst :

Optional<List> o = id1.entrySet() .stream() .filter( e -> e.getKey() == 1) .map(Map.Entry::getValue) .findFirst();

En el caso general, si el filtro puede coincidir con múltiples listas, puede recopilarlas en una lista de listas:

List<List> list = id1.entrySet() .stream() .filter(.. some predicate...) .map(Map.Entry::getValue) .collect(Collectors.toList());


También puedes hacerlo así

public Map<Boolean, List<Student>> getpartitionMap(List<Student> studentsList) { List<Predicate<Student>> allPredicates = getAllPredicates(); Predicate<Student> compositePredicate = allPredicates.stream() .reduce(w -> true, Predicate::and) Map<Boolean, List<Student>> studentsMap= studentsList .stream() .collect(Collectors.partitioningBy(compositePredicate)); return studentsMap; } public List<Student> getValidStudentsList(Map<Boolean, List<Student>> studentsMap) throws Exception { List<Student> validStudentsList = studentsMap.entrySet() .stream() .filter(p -> p.getKey() == Boolean.TRUE) .flatMap(p -> p.getValue().stream()) .collect(Collectors.toList()); return validStudentsList; } public List<Student> getInValidStudentsList(Map<Boolean, List<Student>> studentsMap) throws Exception { List<Student> invalidStudentsList = partionedByPredicate.entrySet() .stream() .filter(p -> p.getKey() == Boolean.FALSE) .flatMap(p -> p.getValue().stream()) .collect(Collectors.toList()); return invalidStudentsList; }

Con flatMap obtendrá solo List<Student> lugar de List<List<Student>> .

Gracias