java8将地图映射转换为地图
发布时间:2020-12-15 04:34:44 所属栏目:Java 来源:网络整理
导读:Java8是否可以方便地实现以下要求,即 MapX,Y + MapY,Z = MapX,Z 现在我的代码是 ArrayListString couponCodes = newArrayList("aaa","bbb","ccc");// couponCode -- shopIdArrayListShopCoupon shopCoupons = newArrayList(new ShopCoupon("aaa",1),new Shop
Java8是否可以方便地实现以下要求,即
Map<X,Y> + Map<Y,Z> = Map<X,Z> 现在我的代码是 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); 我想知道实现这个要求是否更方便? 解决方法
另一种方法是直接流式传输第一张地图的入口集,例如:
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 – >关联的非null默认值. right.getOrDefault(e.getValue(),defaultValue),或者如果您不想在结果映射中使用映射,请通过过滤不必要的映射来模仿toMap收集器. public static <X,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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |