Java 8 Stream flatMap 和 group by 代码编译器错误

2023-12-10

// 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>> to Map<String,List<WeblabInfo>>

如果我不将返回的分配给Map with Map<String, List<Item>> managersItem =在 Eclipse Luna 中,错误位于Map.Entry::getKey and Map.Entry::getValue带有消息的声明:

方式Map.Entry没有定义getKey(Object)这适用于此处”。

我做错了什么?


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

另一方面,没有必要转换List到数组以流式传输它。您可以直接拨打电话users.stream()。但即使创建List没有必要。您可以使用Stream.concat(Stream.of(item.getCreator()), item.getOwners().stream())相反(当然,它有点笨拙)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 8 Stream flatMap 和 group by 代码编译器错误 的相关文章

随机推荐