ejemplo java-8 grouping java-stream collectors flatmap

java-8 - ejemplo - java stream foreach



Java 8 Stream flatMap y grupo por error de compilador de código (2)

No hiciste nada malo. El compilador de Eclipse tiene problemas con la inferencia de tipo que causa estos problemas. Si la compatibilidad de Luna es importante, deberá agregar tipos explícitos a las expresiones lambda. Pruebe, por ejemplo, Map.Entry::<String,Item>getKey

En otra nota, no es necesario convertir una List en una matriz para transmitirla. Puede llamar directamente a users.stream() . Pero incluso la creación de la List no es necesaria. Puede usar Stream.concat(Stream.of(item.getCreator()), item.getOwners().stream()) lugar (concedido, es un poco difícil de manejar).

Finalmente (y lo más importante), evite usar parallelStream con código de bloqueo, como buscar datos en un sistema externo. Las transmisiones paralelas están diseñadas para manejar tareas vinculadas a la CPU.

// given a set of Item objects, group them by the managers of creator and owners Map<String, List<Item>> managersItems = itemSet.parallelStream().flatMap(item -> { // get the list of the creator and owners List<String> users = new ArrayList(); users.add(item.getCreator()); users.addAll(item.getOwners()); return Stream.of(users.toArray(new String[] {})).map(user -> { LdapUserInfo ldapUser = LdapUserInfoFactory.create(user); String manager = ldapUser.getManager(); return new AbstractMap.SimpleImmutableEntry<String, Item(manager, item); }); }).collect( Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

Este código compila bien en Eclipse Mars, pero obtiene el siguiente error en Eclipse Luna:

Tipo no coincidente: no se puede convertir de Map<Object,List<Object>> a Map<String,List<WeblabInfo>>

Si no asigno el devuelto a un Map con Map<String, List<Item>> managersItem = en Eclipse Luna, el error está en Map.Entry::getKey y Map.Entry::getValue con el mensaje:

El tipo Map.Entry no define getKey(Object) que se aplica aquí ".

¿Qué hice mal?


Pude encontrar esta solución a partir de la respuesta de Misha. Esto está funcionando con el compilador Eclipse Luna Java

Map<String, List<Item>> managersItems = itemSet .stream() .<Map.Entry<String, Item>> flatMap(item -> { return Stream.concat(Stream.of(item.getCreatorLogin()), item.getOwners().stream()).map( user -> { LdapUserInfo ldapUser = LdapUserInfoFactory.create(user); String manager = ldapUser.getManagerLoginName(); return new AbstractMap.SimpleEntry<String, Item>(manager, info); }); }) .collect(Collectors.groupingBy(Map.Entry<String, Item>::getKey, Collectors.mapping(Map.Entry<String, Item>::getValue, Collectors.toList())));