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

缩减、分组和分区,深入讲解JavaStream端操作

时间:2023-04-01 16:06:24 Java

鎬濈淮瀵煎浘灏忛晣寤鸿銆傚湪涓婁竴绡囨枃绔犱腑锛屾垜涓哄ぇ瀹惰杩颁簡Stream鐭ヨ瘑鐨勫墠鍗婇儴鍒嗏€斺€斿寘鎷Stream鐨勬暣浣撴杩般€丼tream鐨勫垱寤恒€丼tream鐨勮浆鎹㈡祦鎿嶄綔锛屼互鍙婂Stream鍐呴儴涓€浜涗紭鍖栫偣鐨勭畝鍗曡瑙c€傝櫧鐒舵櫄浜嗭紝浠婂ぉ缁х画缁欏ぇ瀹惰璁睸tream鐭ヨ瘑鐨勭浜岄儴鍒嗏€斺€旂粓姝㈡搷浣溿€傜敱浜庤繖閮ㄥ垎API鐨勫唴瀹规瘮杈冨箍娉涘拰澶嶆潅锛屾垜浼氬崟鐙紑涓€绡囨枃绔犳潵璇︾粏璁茶В銆傚湪姝e紡寮€濮嬩箣鍓嶏紝鍏堣璇磋仛鍚堟柟娉曟湰韬殑鐗圭偣锛堟垜浼氱敤鑱氬悎鏂规硶鏉ユ寚浠f渶鍚庢搷浣滀腑鐨勬柟娉曪級锛氳仛鍚堟柟娉曚唬琛ㄤ簡鏁翠釜娴佽绠楃殑鏈€缁堢粨鏋滐紝鎵€浠ュ畠鐨勮繑鍥炲€兼槸涓嶆槸Stream銆傝仛鍚堟柟娉曠殑杩斿洖鍊煎彲鑳戒负绌猴紝姣斿杩囨护鍣ㄤ笉鍖归厤鐨勬儏鍐点€傚湪JDK8涓紝浣跨敤Optional鏉ラ伩鍏峃PE銆傛墍鏈夌殑鑱氬悎鏂规硶閮戒細璋冪敤evaluate鏂规硶锛屽畠鏄竴涓唴閮ㄦ柟娉曪紝鍙互鍦ㄦ煡鐪嬫簮鐮佺殑鏃跺€欏垽鏂竴涓柟娉曟槸鍚︽槸鑱氬悎鏂规硶銆傚ソ浜嗭紝浜嗚В浜嗚仛鍚堟柟寮忕殑鐗圭偣锛屼负浜嗘柟渚跨悊瑙o紝鎴戞妸鑱氬悎鏂瑰紡鍒嗕负鍑犵被锛氱畝鍗曠殑鑱氬悎鏂瑰紡鎴戠畝鍗曡涓€涓嬶紝鍏朵粬鐨勯噸鐐硅璇达紝灏ゅ叾鏄痗ollector锛岃兘鍋氱殑澶澶浜嗐€?.Stream鐨勮仛鍚堟柟娉曟槸鎴戜滑鍦ㄤ娇鐢⊿tream鏃跺繀椤昏鐢ㄥ埌鐨勬搷浣溿€傝鐪熷瀹岃繖绡囨枃绔狅紝涓嶈浣犻┈涓婂氨鑳戒娇鐢⊿tream锛岃嚦灏戜綘浼氱敤鍚ю煒?.绗竴鑺傜畝鍗曠殑鑱氬悎鏂规硶锛屽厛浠庣畝鍗曠殑寮€濮嬪惂銆係tream鐨勮仛鍚堟柟寮忔瘮涓婁竴绡囨枃绔犱腑鎻愬埌鐨剆tateless鍜宻tateful鏂瑰紡瑕佸涓€浜涳紝浣嗘槸鍏朵腑鐨勪竴浜涙槸鍙互涓€鐪煎氨瀛︿細鐨勩€傚湪绗竴鑺備腑锛屾垜浠皢璁ㄨ杩欓儴鍒嗘柟娉曪細count():杩斿洖Stream涓厓绱犵殑澶у皬銆俧orEach()锛氶€氳繃鍦ㄥ唴閮ㄥ惊鐜亶鍘哠tream涓殑鎵€鏈夊厓绱犳潵娑堣垂姣忎釜鍏冪礌銆傝鏂规硶娌℃湁杩斿洖鍊笺€俧orEachOrder()锛氭晥鏋滃拰涓婇潰鐨勬柟娉曚竴鏍凤紝浣嗘槸杩欎釜鍙互淇濇寔娑堣垂鐨勯『搴忥紝鍗充娇鏄湪澶氱嚎绋嬬幆澧冧笅銆俛nyMatch(Predicatepredicate)锛氳繖鏄竴涓煭璺搷浣溿€傞€氳繃浼犲叆鏂█鍙傛暟锛屽垽鏂槸鍚︽湁鍏冪礌鍙互鍖归厤鏂█銆俛llMatch(Predicatepredicate)锛氳繖鏄竴涓煭璺搷浣滐紝閫氳繃浼犲叆鏂█鍙傛暟杩斿洖鏄惁鎵€鏈夊厓绱犻兘鑳藉尮閰嶅埌predicate銆俷oneMatch(Predicatepredicate)锛氳繖鏄竴涓煭璺搷浣溿€傞€氳繃浼犲叆鏂█鍙傛暟锛屽垽鏂槸鍚︽墍鏈夊厓绱犻兘涓嶈兘鍖归厤鏂█銆傚鏋滄槸锛屽垯杩斿洖true锛屽惁鍒欒繑鍥瀎alse銆俧indFirst()锛氳繖鏄竴涓煭璺搷浣滐紝杩斿洖Stream涓殑绗竴涓厓绱犮€係tream鍙兘涓虹┖锛屽洜姝よ繑鍥炲€间娇鐢∣ptional杩涜澶勭悊銆俧indAny()锛氳繖鏄竴涓煭璺搷浣滐紝杩斿洖Stream涓殑浠绘剰鍏冪礌锛岄€氬父鏄瓧绗︿覆娴佷腑鐨勭涓€涓厓绱狅紝Stream鍙兘涓虹┖锛屾墍浠ヨ繑鍥炲€肩敤Optional澶勭悊銆備互涓婅櫧鐒舵瘮杈冪畝鍗曪紝浣嗘槸鏈変簲涓秹鍙婄煭璺搷浣滅殑鏂规硶鎴戣繕鏄鎻愪竴涓嬶細绗竴锛宖indFirst()鍜宖indAny()锛屽洜涓哄畠浠彧闇€瑕佽幏鍙栦竴涓厓绱犲嵆鍙€傚彲浠ョ粨鏉燂紝鎵€浠ョ煭璺晥搴斿緢濂界悊瑙c€傜劧鍚庢槸anyMatch鏂规硶锛屽彧闇€瑕佸尮閰嶄竴涓猠lement鏂规硶灏辩粨鏉熶簡锛屾墍浠ュ畠鐨勭煭璺晥鏋滀篃寰堝ソ鐞嗚В銆傛渶鍚庢槸allMatch鏂规硶鍜宯oneMatch銆備箥涓€鐪嬶紝杩欎袱涓柟娉曢渶瑕侀亶鍘嗘暣涓祦涓殑鎵€鏈夊厓绱犮€備簨瀹炰笂锛屽苟闈炲姝ゃ€傛瘮濡俛llMatch鍙鏈変竴涓厓绱犱笉鍖归厤鏂█灏卞彲浠ヨ繑鍥瀎alse锛宯oneMatch鍙鏈変竴涓厓绱犲氨鍙互杩斿洖false銆傚尮閰嶆柇瑷€涔熷彲浠ヨ繑鍥瀎alse锛屾墍浠ラ兘鏄湁鐭矾鏁堟灉鐨勬柟娉曘€?.Reduction2.1reduce锛氬弽澶嶈瘎浼扮浜岃妭鎴戜滑璇磖educe銆傚洜涓鸿繖涓瘝澶娊璞′簡锛屽彧濂芥壘涓€涓€氫織鏄撴噦鐨勮В閲婃潵缈昏瘧杩欏彞璇濄€備笅闈㈡槸reduction鐨勫畾涔夛細灏嗕竴涓猄tream涓殑鎵€鏈夊厓绱犲弽澶嶇粍鍚堝緱鍒颁竴涓粨鏋滅О涓簉eduction銆傛敞鎰忥細鍦ㄥ嚱鏁板紡缂栫▼涓紝杩欑О涓烘姌鍙犮€備妇涓緢绠€鍗曠殑渚嬪瓙锛屾垜鏈?銆?銆?涓変釜鍏冪礌锛屾垜鎶婂畠浠姞鍦ㄤ竴璧凤紝鏈€鍚庡緱鍒版暟瀛?锛岃繖涓繃绋嬪氨鏄綊绾︺€傚啀姣斿鎴戞湁1銆?銆?涓変釜鍏冪礌锛屾垜姣旇緝浠栦滑涓や釜锛屾渶鍚庢寫鍑烘渶澶х殑鏁?鎴栬€呮渶灏忕殑鏁?锛岃繖涓繃绋嬩篃鏄竴涓綊绾︺€傝鎴戜妇涓€涓眰鍜岀殑渚嬪瓙鏉ユ紨绀哄噺灏戯紝瀹冧娇鐢ㄥ噺灏戞柟娉曪細Optionalreduce=List.of(1,2,3).stream().reduce((i1,i2)->i1+i2);棣栧厛锛屼綘鍙兘宸茬粡娉ㄦ剰鍒帮紝鎴戝湪涓婇潰鐨勫皬渚嬪瓙涓竴鐩翠娇鐢╨iangliang杩欎釜璇嶏紝鎰忔€濇槸reduce鏄liangliang鐨勫厓绱犺繘琛屽鐞嗭紝鐒跺悗寰楀埌涓€涓渶缁堢殑鍊硷紝鎵€浠educe鏂规硶鐨勫弬鏁版槸A瀵瑰叾涓や釜鍙傛暟鎵ц浠绘剰澶勭悊浠ヨ幏寰楃粨鏋滅殑浜岃繘鍒惰〃杈惧紡锛屽叾涓叾鍙傛暟鍜岀粨鏋滃繀椤绘槸鍚屼竴绫诲瀷銆傛瘮濡備唬鐮佷腑锛宨1鍜宨2鏄簩杩涘埗琛ㄨ揪寮忕殑涓や釜鍙傛暟锛屽垎鍒唬琛ㄥ厓绱犱腑鐨勭涓€涓厓绱犲拰绗簩涓厓绱犮€傚綋绗竴娆″姞娉曞畬鎴愬悗锛屼細灏嗙粨鏋滆祴鍊肩粰i1body锛宨2浼氱户缁唬琛ㄤ笅涓€涓厓绱狅紝鐩村埌鍏冪礌鍔犲畬锛屽緱鍒版渶缁堢殑缁撴灉銆傚鏋滆寰楄繖鏍蜂笉澶熶紭闆咃紝涔熷彲浠ヤ娇鐢↖nteger涓殑榛樿鏂规硶锛歄ptionalreduce=List.of(1,2,3).stream().reduce(Integer::sum);杩欎篃鏄竴涓柟娉曞紩鐢ㄤ唬琛╨ambda琛ㄨ揪寮忕殑渚嬪瓙銆備綘鍙兘涔熸敞鎰忓埌浜嗭紝瀹冧滑鐨勮繑鍥炲€奸兘鏄疧ptional锛岃繖鏄负浜嗛槻姝㈠嚭鐜癝tream娌℃湁鍏冪礌鐨勬儏鍐点€備綘涔熷彲浠ユ兂鍔炴硶鎽嗚劚杩欑鎯呭喌锛屽氨鏄厓绱犱腑蹇呴』鑷冲皯鏈変竴涓€硷紝杩欓噷reduce涓烘垜浠彁渚涗簡涓€涓噸杞芥柟娉曪細Integerreduce=List.of(1,2,3)銆俿tream().reduce(0,(i1,i2)->i1+i2);鍜屼笂闈㈢殑渚嬪瓙涓€鏍凤紝鍦ㄤ簩杩涘埗琛ㄨ揪寮忕殑鍓嶉潰澧炲姞浜嗕竴涓澶栫殑鍙傛暟銆傝繖涓弬鏁板彨鍋氬垵濮嬪€硷紝鎵€浠ュ嵆浣夸綘鐨凷tream娌℃湁鍏冪礌锛屽畠鏈€缁堜篃浼氳繑鍥炰竴涓?锛岃繖鏍峰氨涓嶉渶瑕丱ptional浜嗐€傚湪瀹為檯鐨勬柟娉曡繍琛屼腑锛屽垵濮嬪€间細鍦ㄧ涓€娆℃墽琛屾椂鍗犳嵁i1鐨勪綅缃紝i2浠h〃Stream涓殑绗竴涓厓绱狅紝鐒跺悗寰楀埌鐨剆um浼氬啀娆″崰鎹甶1鐨勪綅缃紝i2浠h〃涓嬩竴涓厓绱犮€備絾鏄娇鐢ㄥ垵濮嬪€间篃涓嶆槸娌℃湁浠d环鐨勶紝瀹冨簲璇ョ鍚堜竴涓師鍒欙細accumulator.apply(identity,i1)==i1锛屼篃灏辨槸璇寸涓€娆℃墽琛岀殑鏃跺€欙紝瀹冪殑杩斿洖缁撴灉搴旇鏄鍏堝湪鎮ㄧ殑Stream涓坊鍔犱竴涓厓绱犮€傛瘮濡傛垜涓婇潰鐨勪緥瀛愭槸涓€涓姞娉曡繍绠楋紝绗竴娆″姞娉曞氨鏄?+1=1锛屽氨绗﹀悎涓婇潰鐨勫師鍒欍€傝繖涓師鍒欐槸涓轰簡淇濊瘉鍦ㄥ苟琛屾祦鐨勬儏鍐典笅涔熻兘寰楀埌姝g‘鐨勭粨鏋溿€傚鏋滀綘鐨勫垵濮嬪€间负1锛岄偅涔堝苟鍙戞儏鍐典笅姣忎釜绾跨▼鐨勫垵濮嬪寲閮芥槸1锛岄偅涔堜綘鏈€鍚庣殑鍜屼細姣斾綘棰勬湡鐨勮澶с€?.2max锛氫娇鐢╮educe姹傛渶澶у€肩殑鏂规硶max涔熸槸涓€绉峳educe鏂规硶锛岀洿鎺ヨ皟鐢╮educe鏂规硶銆傝鎴戜滑鐪嬩竴涓緥瀛愶細Optionalmax=List.of(1,2,3).stream().max((a,b)->{if(a>b){return1;}else{杩斿洖-1;}});鏄殑锛岃繖灏辨槸max鏂规硶鐨勭敤娉曪紝璁╂垜瑙夊緱鎴戜笉鏄湪浣跨敤鍑芥暟寮忔帴鍙c€傚綋鐒朵篃鍙互浣跨敤Integer鏂规硶鏉ョ畝鍖栵細Optionalmax=List.of(1,2,3).stream().max(Integer::compare);鍗充究濡傛锛岃繖涓柟娉曡繕鏄鎴戣寰楀緢绻佺悙锛岃櫧鐒舵垜鑳界悊瑙ax鏂规硶涓紶閫掑弬鏁版槸涓轰簡鎴戜滑鑷畾涔夋帓搴忚鍒欙紝浣嗘槸鎴戜笉鏄庣櫧涓轰粈涔堟病鏈夊姙娉曟寜鐓ц嚜鐒堕『搴忔帓搴忛粯璁ゆ儏鍐典笅锛屼絾鎴戝繀椤讳紶閫掑弬鏁般€傜洿鍒板悗鏉ワ紝鎴戞兂鍒颁簡鍩烘湰绫诲瀷Stream銆傛灉鐒朵笉鐢ㄤ紶鍙傜洿鎺ヨ幏鍙栨渶澶у€硷細OptionalLongmax=LongStream.of(1,2,3).max();鏋滅劧锛屾垜鑳芥兂鍒扮殑锛岀被搴撹璁¤€呴兘鎯冲埌浜唦娉細OptionalLong鏄疧ptional瀵瑰熀鏈被鍨媗ong鐨勫皝瑁呫€?.3min锛氫娇鐢╮eduction姹傛渶灏弇in鎴栬€呯洿鎺ョ湅渚嬪瓙锛歄ptionalmax=List.of(1,2,3).stream().min(Integer::compare);瀹冨拰max鐨勫尯鍒氨鏄簳灞傛妸>鎹㈡垚浜?锛屽お绠€鍗曚簡锛屽氨涓嶇粏璇翠簡銆?.鏀堕泦鍣ㄥ湪绗笁鑺傦紝鎴戜滑鏉ョ湅鐪嬫敹闆嗗櫒銆傚畠鐨勪綔鐢ㄦ槸鏀堕泦Stream涓殑鍏冪礌锛岀粍鎴愪竴涓柊鐨勯泦鍚堛€傝櫧鐒舵垜鍦ㄦ枃绔犲紑澶村凡缁忕粰浜嗕竴寮犳€濈淮瀵煎浘锛屼絾鏄洜涓烘敹闆嗗櫒鐨凙PI姣旇緝澶氾紝鎵€浠ュ張鐢讳簡涓€寮狅紝浣滀负寮€澶撮偅寮犵殑琛ュ厖锛氭敹闆嗗櫒鐨勬柟娉曞悕鏄痗ollect锛屽畠鐨勬柟娉曟槸瀹氫箟濡備笅锛?R,A>Rcollect(Collectorcollector);椤惧悕鎬濅箟锛屾敹闆嗗櫒灏辨槸鐢ㄦ潵鏀堕泦Stream鐨勫厓绱犵殑锛屾垜浠彲浠ヨ嚜瀹氫箟鏈€缁堟敹闆嗙殑鏄粈涔堬紝浣嗘槸鎴戜滑涓€鑸笉闇€瑕佽嚜宸卞啓锛屽洜涓篔DK鍐呯疆浜咰ollector鐨勫疄鐜扮被鈥斺€旀敹钘忓銆?.1鏀堕泦鏂规硶閫氳繃Collectors锛屾垜浠彲浠ュ緢鏂逛究鐨勪娇鐢ㄥ畠鍐呯疆鐨勬柟娉曟潵鏀堕泦鏁版嵁锛氭瘮濡備綘鎯虫妸鍏冪礌鏀堕泦鍒颁竴涓泦鍚堜腑锛岄偅涔堝彲浠ヤ娇鐢╰oCollection鎴栬€卼oList鏂规硶锛屼絾鏄垜浠竴鑸笉浼氫娇鐢╰oCollection锛屽洜涓哄畠闇€瑕佷紶閫掑弬鏁帮紝娌℃湁浜哄枩娆紶閫掑弬鏁般€備篃鍙互浣跨敤toUnmodifiableList锛屽畠鍜宼oList鐨勫尯鍒湪浜庡畠杩斿洖鐨勯泦鍚堜笉鑳芥敼鍙樺厓绱狅紝姣斿鍒犻櫎鎴栬€呮坊鍔犮€傚啀姣斿锛屽鏋滀綘鎯冲湪鍘婚噸涔嬪悗鏀堕泦鍏冪礌锛岄偅涔堜綘鍙互浣跨敤toSet鎴栬€卼oUnmodifiableSet銆傛帴涓嬫潵鏀句竴涓瘮杈冪畝鍗曠殑渚嬪瓙锛?/toListList.of(1,2,3).stream().collect(Collectors.toList());//toUnmodifiableListList.of(1,2,3).stream().collect(Collectors.toUnmodifiableList());//toSetList.of(1,2,3).stream().collect(Collectors.toSet());//toUnmodifiableSetList.of(1,2,3).stream().collect(Collectors.toUnmodifiableSet());浠ヤ笂鏂规硶娌℃湁鍙傛暟锛屽彲浠ョ珛鍗充娇鐢ㄣ€倀oList搴曞眰涔熸槸缁忓吀鐨凙rrayList锛宼oSet搴曞眰鏄粡鍏哥殑HashSet銆傚彲鑳芥湁鏃跺€欎綘鍙兘鎯虫妸涓€涓敹闆嗗埌涓€涓狹ap涓紝姣斿鎶婅鍗曟暟鎹浆鍖栨垚涓€涓鍗曞搴旂殑璁㈠崟鍙凤紝閭d箞灏卞彲浠ヤ娇鐢╰oMap():Listorders=List.of(newOrder(锛夛紝鏂板懡浠わ紙锛夛級;Mapmap=orders.stream().collect(Collectors.toMap(Order::getOrderNo,order->order));toMap()鏈変袱涓弬鏁帮細绗竴涓弬鏁颁唬琛╧ey锛屾剰鎬濇槸浣犺璁剧疆涓€涓狹apkey锛岃€屾垜杩欓噷鎸囧畾鐨勬槸鍏冪礌涓殑orderNo銆傜浜屼釜鍙傛暟琛ㄧずvalue锛屾剰鎬濇槸浣犺璁剧疆涓€涓狹ap鐨勫€笺€傝繖閲屾垜鐩存帴鎶婂厓绱犳湰韬綔涓哄€硷紝鎵€浠ョ粨鏋滄槸涓€涓狹ap銆傛偍杩樺彲浠ヤ娇鐢ㄥ厓绱犲睘鎬т綔涓哄€硷細Listorders=List.of(newOrder(),newOrder());Map>map=orders.stream().collect(Collectors.toMap(Order::getOrderNo,Order::getItemList));杩欏皢杩斿洖璁㈠崟鍙?椤圭洰鍒楄〃鐨勬槧灏勩€倀oMap()杩樻湁涓や釜閰嶅鏂规硶锛歵oUnmodifiableMap()锛氳繑鍥炰竴涓笉鍙慨鏀圭殑Map銆倀oConcurrentMap()锛氳繑鍥炰竴涓嚎绋嬪畨鍏ㄧ殑Map銆傝繖涓や釜鏂规硶鐨勫弬鏁板拰toMap()瀹屽叏涓€鏍枫€傚敮涓€涓嶅悓鐨勬槸搴曞眰鐢熸垚鐨凪ap鐨勭壒鎬т笉鍚屻€傛垜浠竴鑸娇鐢ㄤ竴涓畝鍗曠殑toMap()銆傚畠鐨勫簳灞傛槸鎴戜滑鏈€甯哥敤鐨凥ashMap()瀹屾垚鐨勩€倀oMap()鍑芥暟铏界劧鍔熻兘寮哄ぇ涓斿父鐢紝浣嗗畠鏈変竴涓嚧鍛界殑缂洪櫡銆傛垜浠煡閬揌ahsMap閬囧埌鐩稿悓鐨刱ey浼氳鐩栵紝浣嗘槸鍦╰oMap()鏂规硶鐢熸垚Map鐨勬椂鍊欏鏋滀綘鎸囧畾鐨刱ey閲嶅浜嗭紝浼氱洿鎺ユ姏鍑哄紓甯搞€傛瘮濡備笂闈㈢殑璁㈠崟渚嬪瓙锛屾垜浠亣璁句袱涓鍗曠殑璁㈠崟鍙锋槸涓€鏍风殑锛屼絾鏄綘鎸囧畾璁㈠崟鍙蜂负key锛岄偅涔堣繖涓柟娉曚細鐩存帴鎶涘嚭IllegalStateException锛屽洜涓哄畠涓嶅厑璁竗ey鍦ㄥ厓绱犺涓€鏍枫€?.2鍒嗙粍鏂规硶濡傛灉浣犳兂瀵规暟鎹繘琛屽垎绫伙紝浣嗘槸浣犳寚瀹氱殑key鍙互閲嶅锛岄偅涔堜綘搴旇浣跨敤groupingBy鑰屼笉鏄痶oMap銆備妇涓畝鍗曠殑渚嬪瓙锛屾垜鎯虫寜璁㈠崟绫诲瀷瀵逛竴涓鍗曢泦鍚堣繘琛屽垎缁勶紝鎵€浠ュ彲浠ヨ繖鏍峰仛锛歀istorders=List.of(newOrder(),newOrder());Map>collect=orders.stream().collect(Collectors.groupingBy(Order::getOrderType));鐩存帴鎸囧畾鐢ㄤ簬鍒嗙粍鐨勫厓绱犲睘鎬э紝瀹冧細鑷姩鏍规嵁璇ュ睘鎬ц繘琛屽垎缁勶紝骞跺皢鍒嗙粍缁撴灉鏀堕泦涓轰竴涓狶ist銆侺istorders=List.of(newOrder(),newOrder());Map>collect=orders.stream().collect(Collectors.groupingBy(Order::getOrderType,toSet()));groupingBy杩樻彁渚涗簡涓€涓厑璁告偍鑷畾涔夋敹闆嗗櫒绫诲瀷鐨勯噸杞斤紝鍥犳瀹冪殑绗簩涓弬鏁版槸涓€涓狢ollector鏀堕泦鍣ㄥ璞°€傚浜嶤ollector绫诲瀷锛屾垜浠竴鑸娇鐢–ollectors绫汇€傜敱浜庢垜浠箣鍓嶄娇鐢ㄨ繃Collectors锛屾墍浠ヤ笉闇€瑕佺洿鎺ュ0鏄庝竴涓猼oSet()鏂规硶锛屼篃灏辨槸璇存垜浠皢鍒嗙粍鍚庣殑鍏冪礌鏀堕泦涓轰竴涓猄et銆俫roupingBy涔熸湁涓€涓被浼肩殑鏂规硶锛屽彨鍋歡roupingByConcurrent()銆傝繖绉嶆柟娉曞彲浠ユ彁楂樺苟琛屽垎缁勭殑鏁堢巼锛屼絾鏄笉鑳戒繚璇侀『搴忥紝杩欓噷灏变笉璇翠簡銆?.3鍒掑垎鏂规硶涓嬮潰浠嬬粛鍙︿竴绉嶅垎缁勭殑鎯呭喌鈥斺€斿垝鍒嗐€傚悕瀛楁湁鐐逛贡锛屽叾瀹炴剰鎬濆緢绠€鍗曪細鏍规嵁TRUE鎴朏ALSE瀵规暟鎹繘琛屽垎缁勶紝绉颁负鍒嗗尯銆傛瘮濡傛垜浠妸涓€缁勮鍗曟寜鐓ф槸鍚︽敮浠樿繘琛屽垎缁勶紝灏辨槸鍒嗗尯锛歀istorders=List.of(newOrder(),newOrder());Map>collect=orders.stream().collect(Collectors.partitioningBy(Order::getIsPaid));鍥犱负涓€涓鍗曟槸鍚︿粯娆惧彧鏈変袱绉嶇姸鎬侊細宸蹭粯娆惧拰鏈粯娆撅紝鎵€浠ヨ繖绉嶅垎缁勬柟寮忕О涓哄垎鍖恒€傚拰groupingBy涓€鏍凤紝瀹冧篃鏈夎嚜瀹氫箟鏀堕泦鍣ㄧ被鍨嬬殑閲嶈浇鏂规硶锛歀istorders=List.of(newOrder(),newOrder());Map>collect=orders.stream().collect(Collectors.partitioningBy(Order::getIsPaid,toSet()));3.4缁忓吀闆曞埢鏂规硶缁堜簬鍒颁簡鏈€鍚庝竴鑺傦紝璇峰師璋呮垜鎶婅繖閮ㄥ垎鏂规硶鍚嶇О寮勫緱杩欎箞涔憋紝浣嗚繖浜涙柟娉曟鏄垜鎵€璇寸殑锛氱粡鍏稿鍒汇€備篃灏辨槸璇达紝Collectors鍐嶆瀹炵幇浜哠tream鍘熸湁鐨勬柟娉曪紝鍖呮嫭锛歮ap鈫抦appingfilter鈫抐ilteringflatMap鈫抐latMappingcount鈫抍ountingreduce鈫抮educingmax鈫抦axBymin鈫抦inBy銆傝繖浜涙柟娉曠殑浣滅敤鎴戝氨涓嶄竴涓€鍒椾妇浜嗐€備笂涓€绡囨枃绔犲凡缁忚寰楀緢璇︾粏浜嗭紝鍞竴涓嶅悓鐨勬槸鏈変簺鏂规硶澶氫簡涓€涓弬鏁般€傝繖涓弬鏁板氨鏄垜浠湪鍒嗙粍鍜屽垎鍖轰腑鎻愬埌鐨勯泦鍚堝弬鏁般€傛偍鍙互鎸囧畾瑕佹敹闆嗙殑瀹瑰櫒銆傛垜鎶婂畠浠嬁鍑烘潵涓昏鏄兂璇磋涓轰粈涔堜細鏈夎繖涔堝鐨勫鐞嗘柟娉曘€傚湪杩欓噷鎴戝彧璋堜釜浜虹湅娉曪紝涓嶄唬琛ㄥ畼鏂规剰瑙併€傛垜瑙夊緱涓昏鏄负浜嗗姛鑳界殑缁勫悎銆傝繖鎰忓懗鐫€浠€涔堬紵鍋囪鎴戞湁鍙︿竴涓渶姹傦細鎸夎鍗曠被鍨嬪璁㈠崟杩涜鍒嗙粍锛屽苟鎵惧嚭姣忕粍涓湁澶氬皯璁㈠崟銆傛垜浠凡缁忚璁鸿繃璁㈠崟鐨勫垎缁勩€傝鎯崇煡閬撴瘡缁勬湁澶氬皯涓鍗曪紝鍙渶瑕佽幏鍙栧搴斿垪琛ㄧ殑澶у皬鍗冲彲銆備笉杩囨垜浠篃涓嶈兘杩欎箞楹荤儲锛岃€屾槸涓€姝ュ埌浣嶃€傝緭鍑虹粨鏋滄椂锛岄敭鍊煎涓鸿鍗曠被鍨嬪拰璁㈠崟鏁伴噺锛歁apcollect=orders.stream().collect(Collectors.groupingBy(Order::getOrderType,counting()));灏辨槸杩欐牱锛屽氨杩欎箞绠€鍗曪紝灏辨槸杩欐牱锛岃繖閲岀殑鎰忔€濇槸鎴戜滑瀵瑰垎缁勫悗鐨勬暟鎹噸鏂扮粺璁°€備笂闈㈢殑渚嬪瓙鍙兘涓嶆槸寰堟槑鏄俱€傚綋鎴戜滑闇€瑕佸鏈€缁堟敹闆嗗悗鐨勬暟鎹繘琛屾搷浣滄椂锛屼竴鑸渶瑕佸厛灏嗗叾杞寲涓篠tream锛岀劧鍚庡啀杩涜鎿嶄綔銆備絾鏄紝浣跨敤Collectors鐨勮繖浜涙柟娉曞彲浠ヨ鎮ㄥ湪Collectors涓柟渚垮湴浣跨敤瀹冧滑銆傝繘琛屾暟鎹鐞嗐€傚啀姣斿锛岃鍗曡繕鏄寜鐓ц鍗曠被鍨嬪垎缁勶紝浣嗘槸鎴戜滑鎯冲緱鍒版瘡涓被鍨嬩腑閲戦鏈€澶х殑璁㈠崟锛岄偅涔堟垜浠彲浠ヨ繖鏍峰仛锛歀istorders=List.of(newOrder(),new鍛戒护锛堬級锛?Map>collect2=orders.stream().collect(groupingBy(Order::getOrderType,maxBy(Comparator.comparing(Order::getMoney))));鏇寸畝娲侊紝鏇存柟渚裤€傛垜浠垎缁勫悗涓嶉渶瑕佷竴涓竴涓湴姹傛渶澶у€硷紝涓€姝ュ氨鍙互鎼炲畾銆傚啀鍒嗙粍鍚庯紝姹傛瘡缁勭殑璁㈠崟閲戦锛歀istorders=List.of(newOrder(),newOrder());Mapcollect=orders.stream().collect(groupingBy(Order::getOrderType,summingLong(Order::getMoney)));浣嗘槸鎴戜滑杩欓噷涓嶈summingLong锛屽畠鏄竴涓唴缃殑please鍜屾搷浣滐紝鏀寔Integer銆丩ong鍜孌ouble銆傝繕鏈変竴涓被浼肩殑鏂规硶鍙仛averagingLong銆傜湅鍚嶅瓧灏辩煡閬撲簡锛屽钩鍧囪捣鏉ユ瘮杈冪畝鍗曘€傚缓璁偍鍦ㄦ湁绌虹殑鏃跺€欐壂鎻忕溂鐫涖€傚畬浜嗭紝鏈€鍚庝竴涓柟娉昷oining()锛屽浜庡瓧绗︿覆鐨勬嫾鎺ラ潪甯告湁鐢細Listorders=List.of(newOrder(),newOrder());Stringcollect=orders.stream().map(Order::getOrderNo).collect(Collectors.joining(","));杩欎釜鏂规硶鐨勬柟娉曞悕鐪嬬潃鐪肩啛锛屾槸鐨勶紝String绫诲湪JDK8涔嬪悗澧炲姞浜嗕竴涓猨oin()鏂规硶锛屼篃鏄敤鏉ユ嫾鎺ュ瓧绗︿覆鐨勶紝Collectors鐨刯oin鍜屽畠鐨勫姛鑳芥槸涓€鏍风殑锛屽簳灞傚疄鐜版槸鍚屾牱锛屼娇鐢⊿tringJoiner绫汇€?.鎬荤粨缁堜簬瀹屾垚浜嗐€傚湪杩欎釜Stream涓殑finalization鎿嶄綔涓紝鎴戞彁鍒颁簡Stream涓墍鏈夌殑鑱氬悎鏂规硶銆傚彲浠ヨ锛岀湅瀹岃繖绡囨枃绔狅紝浣犲凡缁忔帉鎻′簡Stream涓墍鏈夌殑鑱氬悎鎿嶄綔銆傚鏋滄偍涓嶇煡閬撳浣曚娇鐢ㄥ畠涔熸病鍏崇郴銆傛湁涓滆タ灏卞ソ锛屼笉鐒禨tream涓嶈兘鍦ㄤ綘鐨勭煡璇嗕綋绯婚噷鍋歑X锛屾湁鐐瑰彲绗戙€傚綋鐒讹紝鎴戣繕鏄缓璁ぇ瀹跺湪椤圭洰涓娇鐢ㄨ繖浜涚畝娲佺殑API锛屾彁楂樹唬鐮佺殑鍙鎬э紝璁╀唬鐮佹洿鍔犵畝娲併€傚涔犵殑鏃跺€欏緢瀹规槗璁╁埆浜虹溂鍓嶄竴浜畘鍙傝€冧功绫嶏細Java8瀹炴垬