第一种写法:使用Collectors.toMap的方法,如果key重复会直接报错
第二种写法: 使用mergeFunction参数,可以取重复的key中的第一个或最后一个
方案1:#使用Collectors.toMap的方法,如果key重复会直接报错
List<TpLifecircleConsumeDO> list = new ArrayList<>();
TpLifecircleConsumeDO tpLifecircleConsumeDO = new TpLifecircleConsumeDO();
TpLifecircleConsumeDO tpLifecircleConsumeDO2 = new TpLifecircleConsumeDO();
tpLifecircleConsumeDO.setOrderSn("123");
tpLifecircleConsumeDO.setOrderSumprice(new BigDecimal("2.1"));
list.add(tpLifecircleConsumeDO);
tpLifecircleConsumeDO2.setOrderSn("123");
tpLifecircleConsumeDO2.setOrderSumprice(new BigDecimal("2.1"));
list.add(tpLifecircleConsumeDO2);
方案1:#使用Collectors.toMap的方法,如果key重复会直接报错
Map<String, TpLifecircleConsumeDO> consumeDOMap = list.stream().distinct().collect(Collectors.toMap(TpLifecircleConsumeDO::getOrderSn, consumeDo -> consumeDo));
System.out.println(consumeDOMap);
Exception in thread "main" java.lang.IllegalStateException: Duplicate key TpLifecircleConsumeDO[id=<null>,ext1=<null>,ext2=<null>,ext3=<null>,ext4=<null>,token=<null>,openid=<null>,remark=<null>,orderSn=123,bankType=<null>,discount=<null>,payToken=<null>,callBackUrl=<null>,merchantOrderSn=<null>,uid=<null>,mode=<null>,type=<null>,mchid=<null>,redId=<null>,userId=<null>,agentId=<null>,channel=<null>,payTime=<null>,payType=<null>,storeId=<null>,markread=<null>,printNum=<null>,redPreId=<null>,cashierId=<null>,payStatus=<null>,createTime=<null>,discountId=<null>,refundStatus=<null>,rechargeactId=<null>,preferentialId=<null>,repairOrderStatus=<null>,updateTimeAuto=<null>,fee=<null>,refund=<null>,cashFee=<null>,rateFee=<null>,redMoney=<null>,couponFee=<null>,orderPrice=<null>,commissionFee=<null>,discountMoney=<null>,orderSumprice=2.1,autowipingzero=<null>,additionalPrice=<null>,commissionRateFee=<null>,rechargeactAmount=<null>,preferentialAmount=<null>]
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1254)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.stream.DistinctOps$1$2.accept(DistinctOps.java:175)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at com.fshows.lifecircle.datacore.service.facade.impl.MonthlyTableFacadeImpl.main(MonthlyTableFacadeImpl.java:554)
方案2: 使用mergeFunction参数,可以取重复的key中的第一个或最后一个
Map<String, TpLifecircleConsumeDO> consumeDOMap = list.stream().collect(Collectors.toMap(TpLifecircleConsumeDO::getOrderSn, consumeDo -> consumeDo, (key1, key2) -> key1));
System.out.println(consumeDOMap);
源代码:
public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction) {
return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}
public static <T, K, U, M extends Map<K, U>>
Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
Function<? super T, ? extends U> valueMapper,
BinaryOperator<U> mergeFunction,
Supplier<M> mapSupplier) {
BiConsumer<M, T> accumulator
= (map, element) -> map.merge(keyMapper.apply(element),
valueMapper.apply(element), mergeFunction);
return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
}