Java 8 Stream flatMap и ошибка компиляции кода группой
// 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())));
Этот код прекрасно компилируется в Eclipse Mars, но в Eclipse Luna появляется следующее сообщение об ошибке:
Несоответствие типов: невозможно преобразовать из
Map<Object,List<Object>>
вMap<String,List<WeblabInfo>>
Если я не назначу возвращенный Map
с Map<String, List<Item>> managersItem =
в Eclipse Luna ошибка заключается в Map.Entry::getKey
а также Map.Entry::getValue
заявление с сообщением:
Тип
Map.Entry
не определяетgetKey(Object)
это применимо здесь ".
Что я сделал не так?
2 ответа
Вы не сделали ничего плохого. У компилятора Eclipse есть проблемы с выводом типа, который вызывает эти проблемы. Если важна совместимость Luna, вам нужно будет добавить явные типы к лямбда-выражениям. Попробуйте, например, Map.Entry::<String,Item>getKey
С другой стороны, нет необходимости конвертировать List
массив для потоковой передачи. Вы можете напрямую позвонить users.stream()
, Но даже создавая List
не обязательно Ты можешь использовать Stream.concat(Stream.of(item.getCreator()), item.getOwners().stream())
вместо этого (предоставлено, это немного громоздко).
Наконец (и самое главное), избегайте использования parallelStream
с кодом блокировки, например, поиск данных во внешней системе. Параллельные потоки предназначены для обработки задач, связанных с процессором.
Я смог придумать это решение из ответа Миши. Это работает с компилятором Java Eclipse Luna
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())));