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())));
Другие вопросы по тегам