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>>
aMap<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 definegetKey(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())));