首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java8转换Map<X,Y> + Map<Y,Z>转换为Map<X,Z>

java8转换Map<X,Y> + Map<Y,Z>转换为Map<X,Z>
EN

Stack Overflow用户
提问于 2016-06-25 17:02:12
回答 2查看 290关注 0票数 3

Java8是否可以方便地实现以下要求,即

代码语言:javascript
复制
Map<X,Y> + Map<Y,Z> = Map<X,Z>

现在我的代码是

代码语言:javascript
复制
ArrayList<String> couponCodes = newArrayList("aaa", "bbb", "ccc");
// couponCode -- shopId
ArrayList<ShopCoupon> shopCoupons = newArrayList(new ShopCoupon("aaa", 1), new ShopCoupon("bbb", 2), new ShopCoupon("ccc", 3));
Map<String, Integer> couponCodeShopIdMap = shopCoupons.stream().collect(toMap(sc -> sc.getCouponCode(), sc -> sc.getShopId()));
// shopId -- name
ArrayList<Shop> shops = newArrayList(new Shop(1, "zhangsan"), new Shop(2, "lisi"), new Shop(3, "wangwu"));
Map<Integer, String> shopIdNameMap = shops.stream().collect(toMap(s -> s.getId(), s -> s.getName()));

//couponCode -- name
Map<String, String> couponCodeNameMap = couponCodes.stream().collect(toMap(c -> c, c -> shopIdNameMap.get(couponCodeShopIdMap.get(c))));
System.out.println(couponCodeNameMap);

我想知道有没有更方便的方式来实现这个要求?

EN

回答 2

Stack Overflow用户

发布于 2016-06-25 17:20:39

另一种方法是直接在第一个map的条目集上流式传输,例如:

代码语言:javascript
复制
public static <X, Y, Z> Map<X, Z> join(Map<X, Y> left, Map<Y, Z> right) {
    return left.entrySet()
               .stream()
               .collect(toMap(Map.Entry::getKey, e -> right.get(e.getValue())));
}

您唯一需要处理的事情是,当一个值出现在左侧映射中而不是右侧映射中的相应键时,您将拥有一个NullPointerException,因为值映射器函数不允许返回null。在这种情况下,您可以使用getOrDefault提供一个与使用e -> right.getOrDefault(e.getValue(), defaultValue)关联的非空默认值,或者如果您不希望在结果映射中包含映射,可以通过预先过滤不存在的映射来模拟toMap收集器。

代码语言:javascript
复制
public static <X, Y, Z> Map<X, Z> join(Map<X, Y> left, Map<Y, Z> right) {
    return left.entrySet().stream().collect(
        HashMap::new,
        (m, e) -> {
            //if you still want the mapping k -> null, 
            //you can just use put directly
            Z value = right.get(e.getValue());
            if(value != null) m.put(e.getKey(), value);
        },
        Map::putAll);
}
票数 7
EN

Stack Overflow用户

发布于 2016-09-23 13:31:49

您只需使用Java 8中Map的默认方法即可完成

代码语言:javascript
复制
shopIdNameMap.forEach((key,value)->shopIdNameMap.replace(key,couponCodeNameMap.get(value)));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38026758

复制
相关文章

相似问题

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