当前位置: 首页 > 后端技术 > Java

Java8中那些方便实用的地图功能

时间:2023-04-01 19:35:56 Java

鍘熷垱锛氭寜閽棩璁帮紙寰俊鍏紬鍙稩D锛歝odelogs锛夛紝娆㈣繋鍒嗕韩锛岃浆杞借淇濈暀鍑哄銆侷ntroductionjava8涔嬪悗锛屽湪甯哥敤鐨凪ap鎺ュ彛涓鍔犱簡涓€浜涢潪甯稿疄鐢ㄧ殑鍔熻兘锛屽彲浠ュぇ澶х畝鍖栦竴浜涚壒瀹氬満鏅殑浠g爜缂栧啓锛屾彁楂樹唬鐮佺殑鍙鎬с€傝鎴戜滑鏉ョ湅鐪嬨€備互computeIfAbsent鍑芥暟涓轰緥锛屾垜浠粡甯搁渶瑕佸皢鏁版嵁鍒嗙粍鎴怣ap>鐨勫舰寮忋€傚湪java8涔嬪墠锛屼竴鑸槸杩欐牱瀹炵幇鐨勶細Listpayments=getPayments();Map>paymentByTypeMap=newHashMap<>();for(Paymentpayment:payments){if(!paymentByTypeMap.containsKey(payment.getPayTypeId())){paymentByTypeMap.put(payment.getPayTypeId(),newArrayList<>());}paymentByTypeMap.get(payment.getPayTypeId()).add(payment);}鍙互鍙戠幇鍙繘琛屼簡涓€娆″垎缁勬搷浣滐紝浣嗘槸浠g爜闇€瑕佷粩缁嗚€冭檻銆傚綋Map涓病鏈夊搴旂殑鍊兼椂锛岄渶瑕佸厛鎻掑叆涓€涓┖鏍硷紝List杩涘幓銆備絾鏄鏋滀娇鐢╦ava8鎻愪緵鐨刢omputeIfAbsent鏂规硶锛屼唬鐮佷細绠€鍖栧緢澶氾紝濡備笅锛歀istpayments=getPayments();Map>paymentByTypeMap=newHashMap<>();for(Paymentpayment:payments){paymentByTypeMap.computeIfAbsent(payment.getPayTypeId(),k->newArrayList<>()).add(payment);}computeIfAbsent鏂规硶鐨勯€昏緫鏄鏋滄病鏈?Absent)map涓搴旂殑key锛岀劧鍚庢墽琛宭ambda琛ㄨ揪寮忕敓鎴愪竴涓粯璁ゅ€兼斁鍏ap涓繑鍥烇紝鍚﹀垯杩斿洖map涓凡鏈夌殑鍊笺€傚甫榛樿鍊肩殑Map鍥犱负杩欑闇€瑕侀粯璁ゅ€肩殑Map澶父瑙佷簡锛屾墍浠ユ垜涓€鑸皝瑁呬竴涓伐鍏风被浣跨敤锛屽涓嬶細publicclassDefaultHashMapextendsHashMap{Function鍔熻兘锛沺ublicDefaultHashMap(Suppliersupplier){this.function=k->supplier.get();}@Override@SuppressWarnings("unchecked")publicVget(Objectkey){returnsuper.computeIfAbsent((K)key,this.function);鐒跺悗鍍忚繖鏍蜂娇鐢ㄥ畠锛屽涓嬫墍绀猴細{paymentByTypeMap.get(payment.getPayTypeId()).add(payment);}鍛靛懙锛岃繖涓湁鐐瑰儚python鐨刣efaultdict(list)馃榿涓存椂缂撳瓨鏈夋椂鍊欙紝鍦╢or寰幆涓紝闇€瑕佷竴涓复鏃剁紦瀛樻潵澶嶇敤鏌ヨ缁撴灉寰幆锛屼篃鍙互浣跨敤computeIfAbcent锛屽涓嬫墍绀猴細heMap.computeIfAbsent(payment.getPayTypeId(),k->payTypeMapper.queryByPayType(k));payment.setPayTypeName(payType.getPayTypeName());}鍥犱负payments涓笉鍚宲ayment鐨刾ay_type_id寰堟湁鍙兘鏄竴鏍风殑锛屼娇鐢ㄨ繖涓柟娉曞彲浠ラ伩鍏嶅緢澶氶噸澶嶆煡璇紝浣嗘槸濡傛灉涓嶄娇鐢╟omputeIfAbcent鍑芥暟锛屼唬鐮佷細鏈夌偣楹荤儲鍜屾櫐娑┿€倂alue骞跺皢鍏舵斁鍏ap涓苟杩斿洖锛屽惁鍒欒繑鍥瀗ull銆傝繖涓嚱鏁颁竴鑸敤鍦ㄤ袱涓猻et鍏宠仈绛変环鐨勬椂鍊欙紝鍒ゆ柇閫昏緫鍙互灏戝啓涓€娆★紝濡備笅锛欯DatapublicstaticclassOrderPayment{privateOrderorder;绉佷汉娓呭崟<浠樻>浠樻锛沺ublicOrderPayment(璁㈠崟璁㈠崟){杩欎釜銆傝鍗?璁㈠崟锛泃his.payments=newArrayList<>();}publicOrderPaymentaddPayment(浠樻鏂瑰紡){this.payments.add(浠樻鏂瑰紡);褰掕繕杩欎釜锛泒}publicstaticvoidgetOrderWithPayment(){Listorders=getOrders();MaporderPaymentMap=newHashMap<>();for(Orderorder:orders){orderPaymentMap.put(order.getOrderId(),newOrderPayment(order));}Listpayments=getPayments();//灏嗘敮浠樹笌鐩稿叧璁㈠崟鐩稿叧鑱攠}computefunctioncompute鍑芥暟鍏跺疄鍜宑omputeIfPresent鍜宑omputeIfAbcent鍑芥暟绫讳技锛屽彧鏄笉鍏冲績mapvalue涓槸鍚︽湁鍊硷紝鎵цlambda琛ㄨ揪寮忚绠楀嚭鏂扮殑value鏀惧叆map涓繑鍥炪€傝鍑芥暟閫傜敤浜庡垎缁勮凯浠h绠椼€傛瘮濡傛寜缁勬眹鎬婚噾棰濓紝灏遍€傚悎浣跨敤compute鍑芥暟锛屽涓嬶細Listpayments=getPayments();MapamountByTypeMap=newHashMap<>();for(Paymentpayment:payments){amountByTypeMap.compute(payment.getPayTypeId(),(key,oldVal)->oldVal==null?payment.getAmount():oldVal.add(payment.getAmount()));}褰搊ldValue涓簄ull锛岃〃绀哄湪map涓涓€娆¤绠楀搴攌ey鐨勫€硷紝鐩存帴缁欓噺灏卞ソ浜嗭紝鍚庨潰鍐嶆璁$畻鐨勬椂鍊欙紝鐩存帴閫氳繃add鍑芥暟灏辨槸姝eソ銆俶erge鍑芥暟鍙互鍙戠幇涓婇潰浣跨敤compute姹囨€籥mount鏃讹紝lambda琛ㄨ揪寮忛渶瑕佸垽鏂槸鍚︽槸绗竴娆¤绠梜ey鍊硷紝鏈夌偣楹荤儲銆傚鏋滀娇鐢╩erge鍑芥暟锛岃繕鍙互杩涗竴姝ョ畝鍖栦唬鐮侊紝濡備笅锛歛mountByTypeMap.merge(payment.getPayTypeId(),payment.getAmount(),BigDecimal::add);}杩欎釜鍑芥暟澶畝娲佷簡馃槃锛宮erge绗竴涓弬鏁版槸key锛岀浜屼釜鍙傛暟鏄痸alue锛岀涓変釜鍙傛暟鏄€煎悎骞跺嚱鏁般€傜涓€娆¤绠楀搴攌ey鐨剉alue鏃讹紝鐩存帴灏唙alue鏀惧叆map涓€傚悗闈㈠啀娆¤绠楁椂锛屼娇鐢ㄥ€肩粍鍚堝嚱鏁癇igDecimal::add璁$畻鍑轰竴涓柊鐨勬眹鎬诲€硷紝鏀惧叆map涓€俻utIfAbsent鍑芥暟putIfAbsent涔熷彲浠ヤ粠鍚嶅瓧灏辩煡閬撳畠鐨勪綔鐢ㄣ€傚綋map涓病鏈夊搴旂殑key鏃讹紝灏唙alue鏀惧叆map涓€備富瑕佺敤浜庝互涓嬪満鏅細姣斿灏唋ist杞崲涓簃ap鏃讹紝濡傛灉list涓瓨鍦ㄩ噸澶嶅€硷紝put鍜宲utIfAbsent鐨勫尯鍒涓嬶細put淇濈暀鏈€鏂版彃鍏ョ殑鏁版嵁銆俻utIfAbsent淇濈暀鏈€鏃х殑鎻掑叆鏁版嵁銆傝瀹炶瘽锛宩ava涓璮orEach鍑芥暟灏辨槸閬嶅巻map锛屽啓娉曟瘮杈冨暟鍡︼紝涓嶇鏄痚ntrySet鏂规硶杩樻槸keySet鏂规硶锛屽涓嬶細for(Map.Entryentry:amountByTypeMap.entrySet()){鏁存暟payTypeId=entry.getKey();BigDecimal閲戦=entry.getValue();System.out.printf("payTypeId:%s,amount:%s\n",payTypeId,amount);}鍐嶇湅python鎴栬€単o鍐欐硶濡備笅锛氬浜巔ayTypeId锛宎mount鍦╝mountByTypeMap.items()涓細print("payTypeId:%s,amount:%s\n"%(payTypeId,amount))鍙互鍙戠幇python涓殑map閬嶅巻鍐欐硶瑕佸皯鍐欏嚑琛屼唬鐮併€備笉杩囷紝铏界劧java鍦ㄨ娉曞眰闈笉鏀寔杩欑鍐欐硶锛屼絾鏄娇鐢╩ap鐨刦orEach鍑芥暟涔熷彲浠ョ畝鍖栫被浼肩殑鏁堟灉锛屽涓嬶細amountByTypeMap.forEach((payTypeId,amount)->{System.out.printf("payTypeId:%s,閲戦:%s\n",payTypeId,閲戦);});鎬荤粨Java涓€鐩磋寮€鍙戣€呰療鐥呭啓浠g爜杩囦簬绻佺悙锛屼絾鏄粠java8寮€濮嬶紝浠嶮ap銆丼tream銆乿ar銆乵ultiline-string鍒皉ecord锛宩ava鍦ㄤ唬鐮佺紪鍐欏眰闈㈠仛浜嗗緢澶氱畝鍖栵紝鑰屼笖java濂藉儚寮€鎮熶簡馃