如何使用java streams将平面对象转换为意向对象
我有扁平物体 POJO: 有这样的数据:如何使用java streams将平面对象转换为意向对象,java,java-8,java-stream,Java,Java 8,Java Stream,我有扁平物体 POJO: 有这样的数据: [{ house: "houseName1", familyMember: "Son" }, { house: "houseName1", familyMember: "Mom" }, { house: "houseName1", familyMember: "Dad" }] 我想把它转换成层次对象 POJO: 阶级之家{ 字符串houseName; 列出家庭成员; } 类家族成员{ 字符串家族成员; } 我找到的每一个信息都要转换成地图。但是
[{
house: "houseName1",
familyMember: "Son"
},
{
house: "houseName1",
familyMember: "Mom"
},
{
house: "houseName1",
familyMember: "Dad"
}]
我想把它转换成层次对象
POJO:
阶级之家{
字符串houseName;
列出家庭成员;
}
类家族成员{
字符串家族成员;
}
我找到的每一个信息都要转换成地图。但是我想要一个包含List
的List
我该怎么办?试试这个
Map<String,List<FamilyMember>> map = list
.stream()
.collect(
Collectors.groupingBy(
FamilyInformation::getHouseName,
Collectors.mapping(
family -> new FamilyMember(family.getFamilyMember()),
Collectors.toList()
)
)
);
Map=list
.stream()
.收集(
收集者分组(
FamilyInformation::getHouseName,
图(
family->new FamilyMember(family.getFamilyMember()),
收集者
)
)
);
然后
List<House> result = map.entrySet()
.stream()
.map(e -> new House(e.getKey(), e.getValue()))
.collect(Collectors.toList());
List result=map.entrySet()
.stream()
.map(e->newhouse(e.getKey(),e.getValue())
.collect(Collectors.toList());
这是一个非流式版本:
首先,按房屋
分组,并通过forEach
+computeIfAbsent
映射到家庭成员
:
Map<String, List<FamilyMember>> accumulator = new HashMap<>();
source.forEach(f -> accumulator.computeIfAbsent(f.getHouse(),
k -> new ArrayList<>()).add(new FamilyMember(f.getFamilyMember())));
..您尝试了什么?它创建了我
List members=new ArrayList()代码>每次迭代都有那么好吗?好的,我试过你的解决方案,但是我认为有一种方法可以在一个流中完成所有的事情。但另一方面,它不可读是的,像这样list.stream().collect(Collectors.groupingBy(FamilyInformation::getHouseName,Collectors.mapping(family->newfamilymember(family.getFamilyMember()),Collectors.toList())).entrySet().stream().map(e->newhouse(e.getKey(),e.getValue()).collect(Collectors.toList())代码>@HadiJ这仍然是两条流,如果你是这个意思的话,也许只有一行。无论如何(+1)由于我的解决方案与您建议的几乎相同,一旦您的重复次数超过10公里(我会说得更快),您可以确认我指的是什么:
List<House> result = map.entrySet()
.stream()
.map(e -> new House(e.getKey(), e.getValue()))
.collect(Collectors.toList());
Map<String, List<FamilyMember>> accumulator = new HashMap<>();
source.forEach(f -> accumulator.computeIfAbsent(f.getHouse(),
k -> new ArrayList<>()).add(new FamilyMember(f.getFamilyMember())));
List<House> result = new ArrayList<>();
accumulator.forEach((house, familyMembers) -> result.add(new House(house, familyMembers)));