[英]java8 stream grouping by merge objects or aggregate
I have following situation, where two neighborhood objects and same street but different houses. 我有以下情况,其中两个邻居对象和相同的街道但不同的房子。
i am wondering using stream how can i group into one neighborhood object 我想知道如何使用流我如何组成一个邻居对象
in summary i have following data 总之,我有以下数据
Neighborhood: n11
streets: s11
houses: h1
Neighborhood: n11
streets: s11
houses: h2
and i want to merge it to display like as following 我想合并它显示如下
Neighborhood: n11
streets: s11
houses: h1,h2
code as follows 代码如下
public class Neighborhood{
public UUID id;
public List<Street> streets;
public Neighborhood(UUID id, List<Street> streets)
{
this.id=id;
this.streets=streets;
}
}
public class Streets
{
public UUID id;
public List<House> houses;
public Streets(UUID id, List<House> houses)
{
this.id=id;
this.houses=houses
}
}
public class House
{
public UUID id;
public House(id)
{
this.id=id;
}
}
House h1= new House("h11")
Street s1= new Street("s11", asList(h1))
Neighborhood n1 = new Neighborhood("n11", asList(s1));
House h2= new House("h12")
Street s2= new Street("s11", asList(h2))
Neighborhood n2 = new Neighborhood("n11", asList(s2));
Well, you could build a Map<String, Map<String, List<String>>>
, where key is Neighborhood::id
and value is a Map
that has key as Street::id
and value a List of House::id
. 好吧,你可以构建一个Map<String, Map<String, List<String>>>
,其中key是Neighborhood::id
,value是一个Map
,其键为Street::id
并且值为一个List House::id
。 From here building it back to whatever you want is left an exercise to you... 从这里建立它回到你想要的任何东西是给你的运动...
Map<String, Map<String, List<String>>> map = new HashMap<>();
neighborhoods.forEach(neighborhood -> {
Map<String, List<String>> m = map.computeIfAbsent(neighborhood.getId(), (key) -> new HashMap<>());
neighborhood.getStreets()
.forEach(street -> {
m.merge(street.getId(),
street.getHouses()
.stream()
.map(House::getId)
.collect(Collectors.toCollection(ArrayList::new)),
(oldV, newV) -> {
oldV.addAll(newV);
return oldV;
}
);
});
});
I had to change the code you provided a little: 我不得不改变你提供的代码:
import java.util.List;
public class Neighborhood {
public String id;
public List<Street> streets;
public Neighborhood(String id, List<Street> streets) {
this.id = id;
this.streets = streets;
}
}
class Street {
public Street(String id, List<House> houses) {
this.id = id;
this.houses = houses;
}
public String id;
public List<House> houses;
}
class House {
public String id;
public House(String id) {
this.id = id;
}
}
Here is my answer then: 这是我的答案:
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Main {
public static void main(String[] args) {
House h1 = new House("h11");
Street s1 = new Street("s11", Arrays.asList(h1));
House h2 = new House("h12");
Street s2 = new Street("s11", Arrays.asList(h2));
Neighborhood n1 = new Neighborhood("n11", Arrays.asList(s1));
Neighborhood n2 = new Neighborhood("n11", Arrays.asList(s2));
Set<Street> collect = Stream.of(n1, n2).flatMap(neighborhood -> neighborhood.streets.stream())
.collect(Collectors.toSet());
System.out.println(collect);
final Map<String, List<Street>> collect1 = collect.stream().collect(Collectors.groupingBy(street -> street.id));
final List<Neighborhood> neighborhoods = new ArrayList<>();
collect1.forEach((s, streets) -> {
final List<House> collect2 = streets.stream().flatMap(street -> street.houses.stream())
.collect(Collectors.toList());
final Street street = new Street(s, collect2);
neighborhoods.add(new Neighborhood(s, Arrays.asList(street)));
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.