首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按合并对象或聚合对java8流进行分组

问按合并对象或聚合对java8流进行分组
EN

Stack Overflow用户
提问于 2019-02-02 03:49:31
回答 2查看 697关注 0票数 3

我有以下情况,两个邻近的物体,同一条街,但不同的房子。

我想知道如何使用stream组合成一个邻域对象

总而言之,我有以下数据

代码语言:javascript
复制
Neighborhood: n11
streets: s11
houses: h1

Neighborhood: n11
streets: s11
houses: h2

我想合并它来显示,如下所示

代码语言:javascript
复制
Neighborhood: n11
streets: s11
houses: h1,h2

代码如下

代码语言:javascript
复制
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));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-02 07:23:57

您可以构建一个Map<String, Map<String, List<String>>>,其中key是Neighborhood::id,value是一个Map,它的key是Street::id,value是一个House::id列表。从这里开始,把它重新构建到你想要的任何东西都是留给你的一个练习……

代码语言:javascript
复制
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;
                                }
                        );
                    });
    });
票数 1
EN

Stack Overflow用户

发布于 2019-02-02 04:18:05

我不得不稍微修改一下你提供的代码:

代码语言:javascript
复制
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;
    }
}

这就是我的答案:

代码语言:javascript
复制
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)));
        });
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54486293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档