当前位置: 首页 > 知识库问答 >
问题:

Java 8 流平面映射并按代码分组编译器错误

鄂育
2023-03-14
// 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())));

此代码在日食火星中编译良好,但在日食月神中获得以下错误:

类型不匹配:无法从< code >映射转换

如果我没有将返回的分配给具有< code>Map的< code>Map

类型Map。条目未定义此处适用的getKey(Object)

我做错了什么?

共有2个答案

谭毅然
2023-03-14

我能够从米沙的答案中得出这个解决方案。这是与日食月神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())));
钮巴英
2023-03-14

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

另一方面,没有必要将< code>List转换为array来对其进行流处理。可以直接调用< code>users.stream()。但是甚至创建< code>List也不是必须的。可以使用< code > stream . concat(stream . of(item . get creator()),item.getOwners()。stream())取而代之(当然,这有点笨拙)。

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

 类似资料:
  • 我有以下两门课: : : 我希望进行流操作,以便: 将映射到中的 的和分别合并到和中,对于所有具有相同id的s 为此,我编写了以下一段代码: 它的工作和输出如下: 但我相信有一种更好的方式可以达到同样的效果。任何一个指针都很好。

  • 我有以下情况。(伪代码) 我想知道如何将列表os转换为->Bs的映射

  • 我有一个班级排,比如: a类统计数据: 我有一个行列表 我需要把它转换成一个按id1和id2分组的映射,我需要度量数据以这种形式汇总成Stats对象 我正在使用java stream生成这个,但仍停留在这一点上: 如何将列表转换为另一个对象,该对象包含该列表中所有对象的总和? 还有一种方法可以使用java stream将上述形式的两个输出映射合并为第三个输出映射吗? 例如:- 输入:行列表 结果:

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

  • 我在迭代一个对象内的列表时遇到了一个问题,该对象内嵌在另一个映射中。我的目标是迭代这个列表并生成一个映射 ,我希望使用streams和lamdas来实现这一点。 我在上面看到了,我需要通过迭代FolderBo中的elementList从elementBo创建一个带有map 的映射。folderBo本身就在Modelbo的地图内。

  • 给定以下类的,使用Java 8 lambda,我希望获得的,每个帐户类型一个。 到目前为止,我使用以下代码按对进行分组。 如何返回,将列表从每个映射键传递到构造函数中,其中包含每个中的一个?