3
// 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>>

如果我没有在 Eclipse Luna中将返回的值分配给Mapwith ,则错误是 at和带有消息的语句:Map<String, List<Item>> managersItem =Map.Entry::getKeyMap.Entry::getValue

该类型Map.Entry未定义getKey(Object)适用于此处的类型”。

我做错了什么?

4

2 回答 2

4

你没有做错什么。Eclipse 编译器存在导致这些问题的类型推断问题。如果 Luna 兼容性很重要,则必须向 lambda 表达式添加显式类型。试一下,例如,Map.Entry::<String,Item>getKey

另一方面,无需将 a 转换List为数组即可对其进行流式传输。可以直接调用users.stream()。但即使创建List也没有必要。您可以Stream.concat(Stream.of(item.getCreator()), item.getOwners().stream())改用(当然,这有点笨拙)。

最后(也是最重要的),避免使用parallelStream阻塞代码,例如在外部系统中查找数据。并行流旨在处理 CPU 密集型任务。

于 2015-10-13T01:23:04.603 回答
1

我能够从 Misha 的回答中想出这个解决方案。这适用于 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())));
于 2015-10-13T05:29:29.577 回答