在Java8中对不同的对象流执行flatmap时,是否可以合并列表属性?
我有一个流操作,它不是我想要的 鉴于这种数据结构在Java8中对不同的对象流执行flatmap时,是否可以合并列表属性?,java,java-8,Java,Java 8,我有一个流操作,它不是我想要的 鉴于这种数据结构 CatOwner { id, name, List <CatType> } 它会产生这个 { id : 1, name: Steve, cattype : [tabby, ginger, black] } { id : 2, name: Mandy, cattype : [tortashelle, manx, grey] } 有人能帮忙吗?你可以通过创建一个中间地图来实现,但它不
CatOwner {
id,
name,
List <CatType>
}
它会产生这个
{ id : 1, name: Steve, cattype : [tabby, ginger, black] }
{ id : 2, name: Mandy, cattype : [tortashelle, manx, grey] }
有人能帮忙吗?你可以通过创建一个中间地图来实现,但它不是很漂亮
Collection<CatOwner> values = owners.stream()
// blah blah, the other stuff you had
.collect(
Collectors.toMap(
owner -> new Pair<>(owner.getId(), owner.getName()),
Function.identity(),
(a, b) -> {
a.getTypes().addAll(b.getTypes());
return a;
}
)
)
.values();
这表示映射的值是CatOwner
项本身(即映射是Pair
到CatOwner
)
这意味着,如果发生冲突(两个具有相同ID和名称的项目),解决方法是将所有类型从一个CatOwner
添加到另一个
(a, b) -> {
a.getTypes().addAll(b.getTypes());
return a;
}
结果是一个集合
,因为您获取地图的所有值。如果您确实想要/需要一个列表,您可以将这些值添加到一个新列表中
new ArrayList<>(values);
newarraylist(值);
您可能需要更正问题中的catOwners
的用法。这是模棱两可的。理想的解决方案是收集toMap
并选择extAccountDetails
作为键,然后合并列表
以获得值。您应该查看变量名称getCatOwners
==functioncatOwners
,然后您有catOwners
列表,您有类CatOwner
,作为列表的一种类型,您可以使用catOwners
,如果您提供一个完整的CatOwner类以及一些测试数据填充的列表,这也会有所帮助。谢谢,很抱歉,我尝试了一下整理示例代码。CatOwner是一个基本的pojo,有能手、二传手等。但如果Naman的建议不能让我达到那个目的,我会填写它。
Collection<CatOwner> values = owners.stream()
// blah blah, the other stuff you had
.collect(
Collectors.toMap(
owner -> new Pair<>(owner.getId(), owner.getName()),
Function.identity(),
(a, b) -> {
a.getTypes().addAll(b.getTypes());
return a;
}
)
)
.values();
owner -> new Pair<>(owner.getId(), owner.getName())
Function.identity()
(a, b) -> {
a.getTypes().addAll(b.getTypes());
return a;
}
new ArrayList<>(values);