// 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(使用前将#替换为@)