有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

通过合并对象或聚合对java java8流进行分组

我有以下情况,两个邻居的目标和同一条街,但不同的房子

我想知道如何使用流,我可以分组成一个社区对象

总之,我有以下数据

Neighborhood: n11
streets: s11
houses: h1

Neighborhood: n11
streets: s11
houses: h2

我想把它合并显示如下

Neighborhood: n11
streets: s11
houses: h1,h2

代码如下

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));

共 (1) 个答案

  1. # 1 楼答案

    你可以构建一个Map<String, Map<String, List<String>>>,其中key是Neighborhood::id,value是一个Map,key是Street::id,value是House::id的列表。从现在开始,你想做什么就做什么

    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;
                                    }
                            );
                        });
        });