首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java 8流API按多个属性对对象进行分组

使用Java 8流API按多个属性对对象进行分组
EN

Stack Overflow用户
提问于 2017-05-25 10:56:58
回答 4查看 1.5K关注 0票数 4

鉴于我们有一个银行列表,每个银行都有多个办事处,

代码语言:javascript
复制
public class Bank {
   private String name;
   private List<String> branches;
   public String getName(){
       return name;
   }
   public List<String> getBranches(){
       return branches;
   }
}

例如:

代码语言:javascript
复制
Bank "Mizuho": branches=["London", "New York"]
Bank "Goldman": branches = ["London", "Toronto"]

给定一个银行列表,我将拥有每个城市的银行代表图。在上面的示例中,我需要

代码语言:javascript
复制
Map["London"] == ["Mizuho", "Goldman"]
Map["New York"] == ["Mizuho"]
Map["Toronto"] == ["Goldman"]

如何使用Java 8 API实现该结果?使用Java8之前的版本很简单,但很繁琐。谢谢你。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-05-25 19:52:24

代码语言:javascript
复制
Map<String, Set<Bank>> result = new HashMap<>();
for (Bank bank : banks) {
    for (String branch : bank.getBranches()) {
        result.computeIfAbsent(branch, b -> new HashSet<Bank>()).add(bank);
    }
}
票数 6
EN

Stack Overflow用户

发布于 2017-05-25 20:26:19

代码语言:javascript
复制
 banks.flatMap(bank -> bank.getBranches()
             .stream()
             .map(branch -> new AbstractMap.SimpleEntry<>(branch, bank)))
       .collect(Collectors.groupingBy(
             Entry::getKey, 
             Collectors.mapping(Entry::getValue, Collectors.toList())));

结果将是:

代码语言:javascript
复制
{London=[Mizuho, Goldman], NewYork=[Mizuho], Toronto=[Goldman]}
票数 4
EN

Stack Overflow用户

发布于 2017-05-26 03:16:06

您可以使用接受供应商、累加器函数和组合器函数的Stream.collect版本来完成此操作,如下所示:

代码语言:javascript
复制
Map<String, List<Bank>> result = banks.stream()
    .collect(
        HashMap::new,
        (map, bank) -> bank.getBranches().forEach(branch ->
            map.computeIfAbsent(branch, k -> new ArrayList<>()).add(bank)),
        (map1, map2) -> map2.forEach((k, v) -> map1.merge(k, v, (l1, l2) -> {
            l1.addAll(l2);
            return l1;
        })));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44171555

复制
相关文章

相似问题

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