{"id":2250,"date":"2018-02-09T17:24:48","date_gmt":"2018-02-09T09:24:48","guid":{"rendered":"https:\/\/ai.zhousir.top\/?p=2250"},"modified":"2018-02-09T17:25:36","modified_gmt":"2018-02-09T09:25:36","slug":"java8%e5%87%bd%e6%95%b0%e5%bc%8f%e7%bc%96%e7%a8%8b%e6%8e%a2%e7%a7%98","status":"publish","type":"post","link":"https:\/\/ai.zhousir.top\/?p=2250","title":{"rendered":"Java8\u51fd\u6570\u5f0f\u7f16\u7a0b\u63a2\u79d8"},"content":{"rendered":"<p>[java]\u5f15\u5b50<br \/>\n    \u5c06\u884c\u4e3a\u4f5c\u4e3a\u6570\u636e\u4f20\u9012<br \/>\nJava8\u51fd\u6570\u6846\u67b6\u89e3\u8bfb<br \/>\n   \u51fd\u6570\u63a5\u53e3<br \/>\n   \u805a\u5408\u5668<br \/>\n       Reduce<br \/>\n         \u56db\u8981\u7d20<br \/>\n         \u5217\u8868\u7c7b\u805a\u5408\u5668<br \/>\n         \u6620\u5c04\u7c7b\u805a\u5408\u5668<br \/>\n         \u81ea\u5b9a\u4e49\u805a\u5408\u5668<br \/>\n   \u6d41<br \/>\n        Stream\u7684\u63a5\u53e3<br \/>\n         collector\u5b9e\u73b0<br \/>\n         Pipeline<br \/>\n\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u76ca\u5904<br \/>\n     \u66f4\u7cbe\u7ec3\u7684\u4ee3\u7801<br \/>\n     \u66f4\u901a\u7528\u7684\u4ee3\u7801<br \/>\n     \u66f4\u53ef\u6d4b\u7684\u4ee3\u7801<br \/>\n     \u7ec4\u5408\u7684\u529b\u91cf<br \/>\nJava8\u6cdb\u578b<br \/>\n\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b<br \/>\n\u5c0f\u7ed3[\/java]<\/p>\n<h2 id=\"\u5f15\u5b50\">\u5f15\u5b50<\/h2>\n<h3 id=\"\u5c06\u884c\u4e3a\u4f5c\u4e3a\u6570\u636e\u4f20\u9012\">\u5c06\u884c\u4e3a\u4f5c\u4e3a\u6570\u636e\u4f20\u9012<\/h3>\n<p>\u600e\u6837\u5728\u4e00\u884c\u4ee3\u7801\u91cc\u540c\u65f6\u8ba1\u7b97\u4e00\u4e2a\u5217\u8868\u7684\u548c\u3001\u6700\u5927\u503c\u3001\u6700\u5c0f\u503c\u3001\u5e73\u5747\u503c\u3001\u5143\u7d20\u4e2a\u6570\u3001\u5947\u5076\u5206\u7ec4\u3001\u6307\u6570\u3001\u6392\u5e8f\u5462\uff1f<\/p>\n<p>\u7b54\u6848\u662f\u601d\u7ef4\u53cd\u8f6c\uff01\u5c06\u884c\u4e3a\u4f5c\u4e3a\u6570\u636e\u4f20\u9012\u3002 \u6587\u827a\u9752\u5e74\u7684\u4ee3\u7801\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">FunctionUtil<\/span> <\/span>{\r\n\r\n   <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,R&gt; <span class=\"hljs-function\">List&lt;R&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">multiGetResult<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(List&lt;Function&lt;List&lt;T&gt;, R&gt;&gt; functions, List&lt;T&gt; list)<\/span> <\/span>{\r\n     <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> functions.<span class=\"fu\">stream<\/span>().<span class=\"fu\">map<\/span>(f -&gt; f.<span class=\"fu\">apply<\/span>(list)).<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>());\r\n   }\r\n\r\n   <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">main<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(String[] args)<\/span> <\/span>{\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(<span class=\"fu\">multiGetResult<\/span>(\r\n         Arrays.<span class=\"fu\">asList<\/span>(\r\n             list -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">summarizingInt<\/span>(x-&gt;x)),\r\n             list -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">filter<\/span>(x -&gt; x &lt; <span class=\"dv\"><span class=\"hljs-number\">50<\/span><\/span>).<span class=\"fu\">sorted<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>()),\r\n             list -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">groupingBy<\/span>(x-&gt;(x%<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>==<span class=\"dv\"><span class=\"hljs-number\">0<\/span><\/span>? <span class=\"st\"><span class=\"hljs-string\">\"even\"<\/span><\/span>: <span class=\"st\"><span class=\"hljs-string\">\"odd\"<\/span><\/span>))),\r\n             list -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">sorted<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>()),\r\n             list -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">sorted<\/span>().<span class=\"fu\">map<\/span>(Math::sqrt).<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toMap<\/span>(x-&gt;x, y-&gt;Math.<span class=\"fu\">pow<\/span>(<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>,y)))),\r\n         Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">64<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">49<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">25<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">16<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">9<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">4<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">81<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">36<\/span><\/span>)));\r\n   }\r\n}<\/code><\/pre>\n<\/div>\n<p>\u5443\uff0c\u6709\u70b9\u5356\u5f04\u5c0f\u806a\u660e\u3002 \u4e0d\u8fc7\u8981\u662f\u80fd\u5c06\u884c\u4e3a\u4f5c\u4e3a\u6570\u636e\u81ea\u7531\u4f20\u9012\u548c\u65bd\u52a0\u4e8e\u6570\u636e\u96c6\u4ea7\u751f\u7ed3\u679c\uff0c\u90a3\u4e48\u5176\u4ee3\u7801\u8868\u8fbe\u80fd\u529b\u5c06\u5982\u5e84\u5b50\u4e4b\u8a00\uff0c\u6063\u610f\u6f47\u6d12\u800c\u65e0\u6240\u6781\u9650\u3002\u75c5\u6bd2\uff0c\u4e0d\u5c31\u662f\u5c06\u884c\u4e3a\u533f\u8eab\u4e8e\u6570\u636e\u4e2d\u7684\u4e00\u79cd\u8868\u73b0\u4e48\uff1f<\/p>\n<blockquote><p>\u884c\u4e3a\u5c31\u662f\u6570\u636e\u3002<\/p><\/blockquote>\n<h2 id=\"java8\u51fd\u6570\u6846\u67b6\u89e3\u8bfb\">Java8\u51fd\u6570\u6846\u67b6\u89e3\u8bfb<\/h2>\n<p><strong>\u51fd\u6570\u7f16\u7a0b\u7684\u6700\u76f4\u63a5\u7684\u8868\u73b0\uff0c\u83ab\u8fc7\u4e8e\u5c06\u51fd\u6570\u4f5c\u4e3a\u6570\u636e\u81ea\u7531\u4f20\u9012\uff0c\u7ed3\u5408\u6cdb\u578b\u63a8\u5bfc\u80fd\u529b\uff0c\u4f7f\u4ee3\u7801\u8868\u8fbe\u80fd\u529b\u83b7\u5f97\u98de\u4e00\u822c\u7684\u63d0\u5347<\/strong>\u3002\u90a3\u4e48\uff0cJava8\u662f\u600e\u4e48\u652f\u6301\u51fd\u6570\u7f16\u7a0b\u7684\u5462\uff1f\u4e3b\u8981\u6709\u4e09\u4e2a\u6838\u5fc3\u6982\u5ff5\uff1a<\/p>\n<ul>\n<li>\u51fd\u6570\u63a5\u53e3(Function)<\/li>\n<li>\u6d41(Stream)<\/li>\n<li>\u805a\u5408\u5668(Collector)<\/li>\n<\/ul>\n<h3 id=\"\u51fd\u6570\u63a5\u53e3\">\u51fd\u6570\u63a5\u53e3<\/h3>\n<p>\u5173\u4e8e\u51fd\u6570\u63a5\u53e3\uff0c\u9700\u8981\u8bb0\u4f4f\u7684\u5c31\u662f\u4e24\u4ef6\u4e8b\uff1a<\/p>\n<ul>\n<li>\u51fd\u6570\u63a5\u53e3\u662f<strong>\u884c\u4e3a\u7684\u62bd\u8c61<\/strong>\uff1b<\/li>\n<li>\u51fd\u6570\u63a5\u53e3\u662f<strong>\u6570\u636e\u8f6c\u6362\u5668<\/strong>\u3002<\/li>\n<\/ul>\n<p>\u6700\u76f4\u63a5\u7684\u652f\u6301\u5c31\u662f java.util.Function \u5305\u3002\u5b9a\u4e49\u4e86\u56db\u4e2a\u6700\u57fa\u7840\u7684\u51fd\u6570\u63a5\u53e3\uff1a<\/p>\n<ul>\n<li>Supplier&lt;T&gt;: \u6570\u636e\u63d0\u4f9b\u5668\uff0c\u53ef\u4ee5\u63d0\u4f9b T \u7c7b\u578b\u5bf9\u8c61\uff1b\u65e0\u53c2\u7684\u6784\u9020\u5668\uff0c\u63d0\u4f9b\u4e86 get \u65b9\u6cd5\uff1b<\/li>\n<li>Function&lt;T,R&gt;: \u6570\u636e\u8f6c\u6362\u5668\uff0c\u63a5\u6536\u4e00\u4e2a T \u7c7b\u578b\u7684\u5bf9\u8c61\uff0c\u8fd4\u56de\u4e00\u4e2a R\u7c7b\u578b\u7684\u5bf9\u8c61\uff1b \u5355\u53c2\u6570\u5355\u8fd4\u56de\u503c\u7684\u884c\u4e3a\u63a5\u53e3\uff1b\u63d0\u4f9b\u4e86 apply, compose, andThen, identity \u65b9\u6cd5\uff1b<\/li>\n<li>Consumer&lt;T&gt;: \u6570\u636e\u6d88\u8d39\u5668\uff0c \u63a5\u6536\u4e00\u4e2a T\u7c7b\u578b\u7684\u5bf9\u8c61\uff0c\u65e0\u8fd4\u56de\u503c\uff0c\u901a\u5e38\u7528\u4e8e\u8bbe\u7f6eT\u5bf9\u8c61\u7684\u503c\uff1b \u5355\u53c2\u6570\u65e0\u8fd4\u56de\u503c\u7684\u884c\u4e3a\u63a5\u53e3\uff1b\u63d0\u4f9b\u4e86 accept, andThen \u65b9\u6cd5\uff1b<\/li>\n<li>Predicate&lt;T&gt;: \u6761\u4ef6\u6d4b\u8bd5\u5668\uff0c\u63a5\u6536\u4e00\u4e2a T \u7c7b\u578b\u7684\u5bf9\u8c61\uff0c\u8fd4\u56de\u5e03\u5c14\u503c\uff0c\u901a\u5e38\u7528\u4e8e\u4f20\u9012\u6761\u4ef6\u51fd\u6570\uff1b \u5355\u53c2\u6570\u5e03\u5c14\u503c\u7684\u6761\u4ef6\u6027\u63a5\u53e3\u3002\u63d0\u4f9b\u4e86 test (\u6761\u4ef6\u6d4b\u8bd5) , and-or- negate(\u4e0e\u6216\u975e) \u65b9\u6cd5\u3002<\/li>\n<\/ul>\n<p>\u5176\u4e2d, compose, andThen, and, or, negate \u7528\u6765\u7ec4\u5408\u51fd\u6570\u63a5\u53e3\u800c\u5f97\u5230\u66f4\u5f3a\u5927\u7684\u51fd\u6570\u63a5\u53e3\u3002<\/p>\n<p>\u5176\u5b83\u7684\u51fd\u6570\u63a5\u53e3\u90fd\u662f\u901a\u8fc7\u8fd9\u56db\u4e2a\u6269\u5c55\u800c\u6765\u3002<\/p>\n<ul>\n<li>\u5728\u53c2\u6570\u4e2a\u6570\u4e0a\u6269\u5c55\uff1a \u6bd4\u5982\u63a5\u6536\u53cc\u53c2\u6570\u7684\uff0c\u6709 Bi \u524d\u7f00\uff0c \u6bd4\u5982 BiConsumer&lt;T,U&gt;, BiFunction&lt;T,U,R&gt; ;<\/li>\n<li>\u5728\u7c7b\u578b\u4e0a\u6269\u5c55\uff1a \u6bd4\u5982\u63a5\u6536\u539f\u5b50\u7c7b\u578b\u53c2\u6570\u7684\uff0c\u6709 [Int|Double|Long][Function|Consumer|Supplier|Predicate]<\/li>\n<li>\u7279\u6b8a\u5e38\u7528\u7684\u53d8\u5f62\uff1a \u6bd4\u5982 BinaryOperator \uff0c \u662f\u540c\u7c7b\u578b\u7684\u53cc\u53c2\u6570 BiFunction&lt;T,T,T&gt; \uff0c\u4e8c\u5143\u64cd\u4f5c\u7b26 \uff1b UnaryOperator \u662f Function&lt;T,T&gt; \u4e00\u5143\u64cd\u4f5c\u7b26\u3002<\/li>\n<\/ul>\n<p>\u90a3\u4e48\uff0c\u8fd9\u4e9b\u51fd\u6570\u63a5\u53e3\u53ef\u4ee5\u63a5\u6536\u54ea\u4e9b\u503c\u5462\uff1f<\/p>\n<ul>\n<li>\u7c7b\/\u5bf9\u8c61\u7684\u9759\u6001\u65b9\u6cd5\u5f15\u7528\u3001\u5b9e\u4f8b\u65b9\u6cd5\u5f15\u7528\u3002\u5f15\u7528\u7b26\u53f7\u4e3a\u53cc\u5192\u53f7 ::<\/li>\n<li>\u7c7b\u7684\u6784\u9020\u5668\u5f15\u7528\uff0c\u6bd4\u5982 Class::new<\/li>\n<li>lambda\u8868\u8fbe\u5f0f<\/li>\n<\/ul>\n<p>\u5728\u535a\u6587\u201c<a href=\"http:\/\/www.cnblogs.com\/lovesqcc\/p\/6649018.html\" target=\"_blank\">\u4f7f\u7528\u51fd\u6570\u63a5\u53e3\u548c\u679a\u4e3e\u5b9e\u73b0\u914d\u7f6e\u5f0f\u7f16\u7a0b(Java\u4e0eScala\u5b9e\u73b0)<\/a>\u201d, \u201c<a href=\"http:\/\/www.cnblogs.com\/lovesqcc\/p\/7077971.html\" target=\"_blank\">\u7cbe\u7ec3\u4ee3\u7801\uff1a\u4e00\u6b21Java\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u91cd\u6784\u4e4b\u65c5<\/a>\u201d \u7ed9\u51fa\u4e86\u57fa\u672c\u7684\u4f8b\u5b50\u3002\u540e\u9762\u8fd8\u6709\u66f4\u591a\u4f8b\u5b50\u3002\u91cd\u5728\u81ea\u5df1\u7ec3\u4e60\u548c\u5c1d\u8bd5\u3002<\/p>\n<h3 id=\"\u805a\u5408\u5668\">\u805a\u5408\u5668<\/h3>\n<p>\u5148\u8bf4\u805a\u5408\u5668\u3002\u6bcf\u4e00\u4e2a\u6d41\u5f0f\u8ba1\u7b97\u7684\u672b\u5c3e\u603b\u6709\u4e00\u4e2a\u7c7b\u4f3c collect(Collectors.toList()) \u7684\u65b9\u6cd5\u8c03\u7528\u3002collect \u662f Stream \u7684\u65b9\u6cd5\uff0c\u800c\u53c2\u6570\u5219\u662f\u805a\u5408\u5668Collector\u3002\u5df2\u6709\u7684\u805a\u5408\u5668\u5b9a\u4e49\u5728Collectors \u7684\u9759\u6001\u65b9\u6cd5\u91cc\u3002 \u90a3\u4e48\u8fd9\u4e2a\u805a\u5408\u5668\u662f\u600e\u4e48\u5b9e\u73b0\u7684\u5462\uff1f<\/p>\n<h4 id=\"reduce\">Reduce<\/h4>\n<p>\u5927\u90e8\u5206\u805a\u5408\u5668\u90fd\u662f\u57fa\u4e8e Reduce \u64cd\u4f5c\u5b9e\u73b0\u7684\u3002 Reduce \uff0c\u540d\u66f0\u63a8\u5bfc\uff0c\u542b\u6709\u4e09\u4e2a\u8981\u7d20\uff1a \u521d\u59cb\u503c init, \u4e8c\u5143\u64cd\u4f5c\u7b26 BinaryOperator, \u4ee5\u53ca\u4e00\u4e2a\u7528\u4e8e\u805a\u5408\u7ed3\u679c\u7684\u6570\u636e\u6e90S\u3002<\/p>\n<p>Reduce \u7684\u7b97\u6cd5\u5982\u4e0b\uff1a<\/p>\n<p>STEP1: \u521d\u59cb\u5316\u7ed3\u679c R = init \uff1b<\/p>\n<p>STEP2: \u6bcf\u6b21\u4ece S \u4e2d\u53d6\u51fa\u4e00\u4e2a\u503c v\uff0c\u901a\u8fc7\u4e8c\u5143\u64cd\u4f5c\u7b26\u65bd\u52a0\u5230 R \u548c v \uff0c\u4ea7\u751f\u4e00\u4e2a\u65b0\u503c\u8d4b\u7ed9 R = BinaryOperator(R, v)\uff1b\u91cd\u590d STEP2\uff0c \u76f4\u5230 S \u4e2d\u6ca1\u6709\u503c\u53ef\u53d6\u4e3a\u6b62\u3002<\/p>\n<p>\u6bd4\u5982\u4e00\u4e2a\u5217\u8868\u6c42\u548c\uff0cSum([1,2,3]) , \u90a3\u4e48\u5b9a\u4e49\u4e00\u4e2a\u521d\u59cb\u503c 0 \u4ee5\u53ca\u4e00\u4e2a\u4e8c\u5143\u52a0\u6cd5\u64cd\u4f5c BO = a + b \uff0c\u901a\u8fc7\u4e09\u6b65\u5b8c\u6210 Reduce \u64cd\u4f5c\uff1astep1: R = 0; step2: v=1, R = 0+v = 1; step2: v=2, R = 1 + v = 3 ; step3: v = 3, R = 3 + v = 6\u3002<\/p>\n<h4 id=\"\u56db\u8981\u7d20\">\u56db\u8981\u7d20<\/h4>\n<p>\u4e00\u4e2a\u805a\u5408\u5668\u7684\u5b9e\u73b0\uff0c\u901a\u5e38\u9700\u8981\u63d0\u4f9b\u56db\u8981\u7d20\uff1a<\/p>\n<ul>\n<li>\u4e00\u4e2a\u7ed3\u679c\u5bb9\u5668\u7684\u521d\u59cb\u503c\u63d0\u4f9b\u5668 supplier \uff1b<\/li>\n<li>\u4e00\u4e2a\u7528\u4e8e\u5c06\u6bcf\u6b21\u4e8c\u5143\u64cd\u4f5c\u7684\u4e2d\u95f4\u7ed3\u679c\u4e0e\u7ed3\u679c\u5bb9\u5668\u7684\u503c\u8fdb\u884c\u64cd\u4f5c\u5e76\u91cd\u65b0\u8bbe\u7f6e\u7ed3\u679c\u5bb9\u5668\u7684\u7d2f\u79ef\u5668 accumulator \uff1b<\/li>\n<li>\u4e00\u4e2a\u7528\u4e8e\u5bf9Stream\u5143\u7d20\u548c\u4e2d\u95f4\u7ed3\u679c\u8fdb\u884c\u64cd\u4f5c\u7684\u4e8c\u5143\u64cd\u4f5c\u7b26 combiner \uff1b<\/li>\n<li>\u4e00\u4e2a\u7528\u4e8e\u5bf9\u7ed3\u679c\u5bb9\u5668\u8fdb\u884c\u6700\u7ec8\u805a\u5408\u7684\u8f6c\u6362\u5668 finisher\uff08\u53ef\u9009) \u3002<\/li>\n<\/ul>\n<p>Collectors.CollectorImpl \u7684\u5b9e\u73b0\u5c55\u793a\u4e86\u8fd9\u4e00\u70b9\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">CollectorImpl<\/span>&lt;<span class=\"hljs-title\">T<\/span>, <span class=\"hljs-title\">A<\/span>, <span class=\"hljs-title\">R<\/span>&gt; <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Collector<\/span>&lt;<span class=\"hljs-title\">T<\/span>, <span class=\"hljs-title\">A<\/span>, <span class=\"hljs-title\">R<\/span>&gt; <\/span>{\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">private<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">final<\/span><\/span> Supplier&lt;A&gt; supplier;\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">private<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">final<\/span><\/span> BiConsumer&lt;A, T&gt; accumulator;\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">private<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">final<\/span><\/span> BinaryOperator&lt;A&gt; combiner;\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">private<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">final<\/span><\/span> Function&lt;A, R&gt; finisher;\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">private<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">final<\/span><\/span> Set&lt;Characteristics&gt; characteristics;\r\n\r\n        <span class=\"fu\">CollectorImpl<\/span>(Supplier&lt;A&gt; supplier,\r\n                      BiConsumer&lt;A, T&gt; accumulator,\r\n                      BinaryOperator&lt;A&gt; combiner,\r\n                      Function&lt;A,R&gt; finisher,\r\n                      Set&lt;Characteristics&gt; characteristics) {\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">this<\/span><\/span>.<span class=\"fu\">supplier<\/span> = supplier;\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">this<\/span><\/span>.<span class=\"fu\">accumulator<\/span> = accumulator;\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">this<\/span><\/span>.<span class=\"fu\">combiner<\/span> = combiner;\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">this<\/span><\/span>.<span class=\"fu\">finisher<\/span> = finisher;\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">this<\/span><\/span>.<span class=\"fu\">characteristics<\/span> = characteristics;\r\n        }\r\n}<\/code><\/pre>\n<\/div>\n<h4 id=\"\u5217\u8868\u7c7b\u805a\u5408\u5668\">\u5217\u8868\u7c7b\u805a\u5408\u5668<\/h4>\n<p>\u5217\u8868\u7c7b\u805a\u5408\u5668\u5b9e\u73b0\uff0c\u57fa\u672c\u662f\u57fa\u4e8eReduce \u64cd\u4f5c\u5b8c\u6210\u7684\u3002 \u770b\u5982\u4e0b\u4ee3\u7801\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T&gt;\r\n    Collector&lt;T, ?, List&lt;T&gt;&gt; <span class=\"fu\">toList<\/span>() {\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> CollectorImpl&lt;&gt;((Supplier&lt;List&lt;T&gt;&gt;) ArrayList::<span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span>, List::add,\r\n                                   (left, right) -&gt; { left.<span class=\"fu\">addAll<\/span>(right); <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> left; },\r\n                                   CH_ID);<\/code><\/pre>\n<\/div>\n<p>\u9996\u5148\u4f7f\u7528 ArrayList::new \u521b\u9020\u4e00\u4e2a\u7a7a\u5217\u8868\uff1b \u7136\u540e List:add \u5c06Stream\u7d2f\u79ef\u64cd\u4f5c\u7684\u4e2d\u95f4\u7ed3\u679c\u52a0\u5165\u5230\u8fd9\u4e2a\u5217\u8868\uff1b\u7b2c\u4e09\u4e2a\u51fd\u6570\u5219\u5c06\u4e24\u4e2a\u5217\u8868\u5143\u7d20\u8fdb\u884c\u5408\u5e76\u6210\u4e00\u4e2a\u7ed3\u679c\u5217\u8868\u4e2d\u3002 \u5c31\u662f\u8fd9\u4e48\u7b80\u5355\u3002\u96c6\u5408\u805a\u5408\u5668 toSet(), \u5b57\u7b26\u4e32\u8fde\u63a5\u5668 joining()\uff0c\u4ee5\u53ca\u5217\u8868\u6c42\u548c(summingXXX)\u3001\u6700\u5927(maxBy)\u3001\u6700\u5c0f\u503c(minBy)\u7b49\u90fd\u662f\u8fd9\u4e2a\u5957\u8def\u3002<\/p>\n<h4 id=\"\u6620\u5c04\u7c7b\u805a\u5408\u5668\">\u6620\u5c04\u7c7b\u805a\u5408\u5668<\/h4>\n<p>\u6620\u5c04\u7c7b\u805a\u5408\u5668\u57fa\u4e8eMap\u5408\u5e76\u6765\u5b8c\u6210\u3002\u770b\u8fd9\u6bb5\u4ee3\u7801\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">private<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;K, V, M <span class=\"kw\">extends<\/span> Map&lt;K,V&gt;&gt;\r\n    <span class=\"hljs-function\">BinaryOperator&lt;M&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">mapMerger<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(BinaryOperator&lt;V&gt; mergeFunction)<\/span> <\/span>{\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> (m1, m2) -&gt; {\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">for<\/span><\/span> (Map.<span class=\"fu\">Entry<\/span>&lt;K,V&gt; e : m2.<span class=\"fu\">entrySet<\/span>())\r\n                m1.<span class=\"fu\">merge<\/span>(e.<span class=\"fu\">getKey<\/span>(), e.<span class=\"fu\">getValue<\/span>(), mergeFunction);\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> m1;\r\n        };\r\n    }<\/code><\/pre>\n<\/div>\n<p>\u6839\u636e\u6307\u5b9a\u7684\u503c\u5408\u5e76\u51fd\u6570 mergeFunction, \u8fd4\u56de\u4e00\u4e2amap\u5408\u5e76\u5668\uff0c\u7528\u6765\u5408\u5e76\u4e24\u4e2amap\u91cc\u76f8\u540ckey\u7684\u503c\u3002mergeFunction\u7528\u6765\u5bf9\u4e24\u4e2amap\u4e2d\u76f8\u540ckey\u7684\u503c\u8fdb\u884c\u8fd0\u7b97\u5f97\u5230\u65b0\u7684value\u503c\uff0c\u5982\u679cvalue\u503c\u4e3anull\uff0c\u4f1a\u79fb\u9664\u76f8\u5e94\u7684key\uff0c\u5426\u5219\u4f7f\u7528value\u503c\u4f5c\u4e3a\u5bf9\u5e94key\u7684\u503c\u3002\u8fd9\u4e2a\u65b9\u6cd5\u662f\u79c1\u6709\u7684\uff0c\u4e3b\u8981\u4e3a\u652f\u6491 toMap\uff0cgroupingBy \u800c\u751f\u3002<\/p>\n<p>toMap\u7684\u5b9e\u73b0\u5f88\u7b80\u77ed\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u5c06\u6307\u5b9astream\u7684\u6bcf\u4e2a\u5143\u7d20\u5206\u522b\u4f7f\u7528\u7ed9\u5b9a\u51fd\u6570keyMapper, valueMapper\u8fdb\u884c\u6620\u5c04\u5f97\u5230 newKey, newValue\uff0c\u4ece\u800c\u5f62\u6210\u65b0\u7684Map[newKey,newValue] (1), \u518d\u4f7f\u7528mapMerger(mergeFunction) \u751f\u6210\u7684 map \u5408\u5e76\u5668\u5c06\u5176\u5408\u5e76\u5230 mapSupplier (2)\u3002\u5982\u679c\u53ea\u4f20 keyMapper, valueMapper\uff0c\u90a3\u4e48\u5c31\u53ea\u5f97\u5230\u7ed3\u679c(1)\u3002<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T, K, U, M <span class=\"kw\">extends<\/span> Map&lt;K, U&gt;&gt;\r\n    Collector&lt;T, ?, M&gt; <span class=\"fu\">toMap<\/span>(Function&lt;? <span class=\"kw\"><span class=\"hljs-keyword\">super<\/span><\/span> T, ? <span class=\"kw\">extends<\/span> K&gt; keyMapper,\r\n                                Function&lt;? <span class=\"kw\"><span class=\"hljs-keyword\">super<\/span><\/span> T, ? <span class=\"kw\">extends<\/span> U&gt; valueMapper,\r\n                                BinaryOperator&lt;U&gt; mergeFunction,\r\n                                Supplier&lt;M&gt; mapSupplier) {\r\n        BiConsumer&lt;M, T&gt; accumulator\r\n                = (map, element) -&gt; map.<span class=\"fu\">merge<\/span>(keyMapper.<span class=\"fu\">apply<\/span>(element),\r\n                                              valueMapper.<span class=\"fu\">apply<\/span>(element), mergeFunction);\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> CollectorImpl&lt;&gt;(mapSupplier, accumulator, <span class=\"fu\">mapMerger<\/span>(mergeFunction), CH_ID);\r\n    }<\/code><\/pre>\n<\/div>\n<p>toMap \u7684\u4e00\u4e2a\u793a\u4f8b\u89c1\u5982\u4e0b\u4ee3\u7801\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\">     List&lt;Integer&gt; list = Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">3<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">4<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">5<\/span><\/span>);\r\n     Supplier&lt;Map&lt;Integer,Integer&gt;&gt; mapSupplier = () -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toMap<\/span>(x-&gt;x, y-&gt; y * y));\r\n\r\n     Map&lt;Integer, Integer&gt; mapValueAdd = list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toMap<\/span>(x-&gt;x, y-&gt;y, (v1,v2) -&gt; v1+v2, mapSupplier));\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(mapValueAdd);<\/code><\/pre>\n<\/div>\n<p>\u5c06\u4e00\u4e2a List \u8f6c\u6210 map[1=1,2=2,3=3,4=4,5=5]\uff0c\u7136\u540e\u4e0e\u53e6\u4e00\u4e2amap[1=1,2=4,3=9,4=16,5=25]\u7684\u76f8\u540ckey\u7684value\u8fdb\u884c\u76f8\u52a0\u3002\u6ce8\u610f\u5230, toMap \u7684\u6700\u540e\u4e00\u4e2a\u53c2\u6570\u662f Supplier&lt;Map&gt; \uff0c \u662f Map \u63d0\u4f9b\u5668\uff0c\u800c\u4e0d\u662f Map \u5bf9\u8c61\u3002\u5982\u679c\u7528Map\u5bf9\u8c61\uff0c\u4f1a\u62a5 no instances of type variables M exists so that conforms to Supplier&lt;M&gt;\u3002 \u5728\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u4e16\u754c\u91cc\uff0c\u901a\u5e38\u662f\u7528\u51fd\u6570\u6765\u8868\u8fbe\u548c\u7ec4\u5408\u7684\u3002<\/p>\n<h4 id=\"\u81ea\u5b9a\u4e49\u805a\u5408\u5668\">\u81ea\u5b9a\u4e49\u805a\u5408\u5668<\/h4>\n<p>\u8ba9\u6211\u4eec\u4eff\u7167 Collectors.toList() \u505a\u4e00\u4e2a\u81ea\u5b9a\u4e49\u7684\u805a\u5408\u5668\u3002\u5b9e\u73b0\u4e00\u4e2a\u542bN\u4e2a\u6570\u7684\u6590\u6ce2\u90a3\u5951\u5e8f\u5217 List&lt;Integer&gt;\u3002\u7531\u4e8e Reduce \u6bcf\u6b21\u90fd\u4ece\u6d41\u4e2d\u53d6\u4e00\u4e2a\u6570\uff0c\u56e0\u6b64\u9700\u8981\u751f\u4ea7\u4e00\u4e2a\u542bN\u4e2a\u6570\u7684stream\uff1b\u53ef\u4f7f\u7528 Arrays.asList(1,2,3,4,5,6,7,8,9,10).stream() \uff0c \u4ea6\u53ef\u4f7f\u7528 IntStream.range(1,11) \uff0c\u4e0d\u8fc7\u4e24\u8005\u7684 collector \u65b9\u6cd5\u662f\u4e0d\u4e00\u6837\u7684\u3002\u8fd9\u91cc\u6211\u4eec\u53d6\u524d\u8005\u3002<\/p>\n<p>\u73b0\u5728\uff0c\u9700\u8981\u6784\u9020\u56db\u8981\u7d20\uff1a<\/p>\n<ul>\n<li>\u53ef\u53d8\u7684\u7ed3\u679c\u5bb9\u5668\u63d0\u4f9b\u5668 Supplier&lt;List&lt;Integer&gt;&gt; = () -&gt; [0, 1] \uff1b \u6ce8\u610f\u8fd9\u91cc\u4e0d\u80fd\u4f7f\u7528 Arrays.asList , \u56e0\u4e3a\u8be5\u65b9\u6cd5\u751f\u6210\u7684\u5217\u8868\u662f\u4e0d\u53ef\u53d8\u7684\u3002<\/li>\n<li>\u7d2f\u79ef\u5668 BiConsumer&lt;List&lt;Integer&gt;, Integer&gt; accumulator()\uff1a \u8fd9\u91cc\u6d41\u7684\u5143\u7d20\u672a\u7528\uff0c\u4ec5\u4ec5\u7528\u6765\u4f7f\u8ba1\u7b97\u8fdb\u884c\u548c\u7ec8\u6b62\u3002\u65b0\u7684\u5143\u7d20\u4ece\u7ed3\u679c\u5bb9\u5668\u4e2d\u53d6\u6700\u540e\u4e24\u4e2a\u76f8\u52a0\u540e\u4ea7\u751f\u65b0\u7684\u7ed3\u679c\u653e\u5230\u7ed3\u679c\u5bb9\u5668\u4e2d\u3002<\/li>\n<li>\u7ec4\u5408\u5668 BinaryOperator&lt;List&lt;Integer&gt;&gt; combiner() \uff1a \u7167\u846b\u82a6\u753b\u74e2\uff0c\u76ee\u524d\u6ca1\u770b\u51fa\u8fd9\u6b65\u662f\u505a\u4ec0\u4e48\u7528\uff1b\u76f4\u63a5 return null; \u4e5f\u662fOK\u7684\u3002<\/li>\n<li>\u6700\u7ec8\u8f6c\u6362\u5668 Function&lt;List&lt;Integer&gt;, List&lt;Integer&gt;&gt; finisher() \uff1a\u5728\u6700\u7ec8\u8f6c\u6362\u5668\u4e2d\uff0c\u79fb\u9664\u521d\u59cb\u8bbe\u7f6e\u7684\u4e24\u4e2a\u503c 0, 1 \u3002<\/li>\n<\/ul>\n<p>\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"co\"><span class=\"hljs-comment\">\/**<\/span><\/span>\r\n<span class=\"co\"><span class=\"hljs-comment\"> * Created by shuqin on 17\/12\/5.<\/span><\/span>\r\n<span class=\"co\"><span class=\"hljs-comment\"> *\/<\/span><\/span>\r\n<span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">FiboCollector<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Collector<\/span>&lt;<span class=\"hljs-title\">Integer<\/span>, <span class=\"hljs-title\">List<\/span>&lt;<span class=\"hljs-title\">Integer<\/span>&gt;, <span class=\"hljs-title\">List<\/span>&lt;<span class=\"hljs-title\">Integer<\/span>&gt;&gt; <\/span>{\r\n\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> Supplier&lt;List&lt;Integer&gt;&gt; <span class=\"fu\">supplier<\/span>() {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> () -&gt; {\r\n      List&lt;Integer&gt; result = <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> ArrayList&lt;&gt;();\r\n      result.<span class=\"fu\">add<\/span>(<span class=\"dv\"><span class=\"hljs-number\">0<\/span><\/span>); result.<span class=\"fu\">add<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>);\r\n      <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> result;\r\n    };\r\n  }\r\n\r\n  <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> BiConsumer&lt;List&lt;Integer&gt;, Integer&gt; <span class=\"fu\">accumulator<\/span>() {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> (res, num) -&gt; {\r\n      Integer next = res.<span class=\"fu\">get<\/span>(res.<span class=\"fu\">size<\/span>()-<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>) + res.<span class=\"fu\">get<\/span>(res.<span class=\"fu\">size<\/span>()-<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>);\r\n      res.<span class=\"fu\">add<\/span>(next);\r\n    };\r\n  }\r\n\r\n  <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> BinaryOperator&lt;List&lt;Integer&gt;&gt; <span class=\"fu\">combiner<\/span>() {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>;\r\n    <span class=\"co\"><span class=\"hljs-comment\">\/\/return (left, right) -&gt; { left.addAll(right); return left; };<\/span><\/span>\r\n  }\r\n\r\n  <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> Function&lt;List&lt;Integer&gt;, List&lt;Integer&gt;&gt; <span class=\"fu\">finisher<\/span>() {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> res -&gt; { res.<span class=\"fu\">remove<\/span>(<span class=\"dv\"><span class=\"hljs-number\">0<\/span><\/span>); res.<span class=\"fu\">remove<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>); <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> res; };\r\n  }\r\n\r\n  <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n  <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span><span class=\"hljs-function\"> Set&lt;Characteristics&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">characteristics<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> <\/span>{\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> Collections.<span class=\"fu\">emptySet<\/span>();\r\n  }\r\n\r\n}\r\n\r\nList&lt;Integer&gt; fibo = Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">3<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">4<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">5<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">6<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">7<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">8<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">9<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">10<\/span><\/span>).<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(<span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> <span class=\"fu\">FiboCollector<\/span>());\r\nSystem.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(fibo);<\/code><\/pre>\n<\/div>\n<h3 id=\"\u6d41\">\u6d41<\/h3>\n<p>\u6d41\uff08Stream\uff09\u662fJava8\u5bf9\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u91cd\u8981\u652f\u6491\u3002\u5927\u90e8\u5206\u51fd\u6570\u5f0f\u5de5\u5177\u90fd\u56f4\u7ed5Stream\u5c55\u5f00\u3002<\/p>\n<h4 id=\"stream\u7684\u63a5\u53e3\">Stream\u7684\u63a5\u53e3<\/h4>\n<p>Stream \u4e3b\u8981\u6709\u56db\u7c7b\u63a5\u53e3\uff1a<\/p>\n<ul>\n<li>\u6d41\u5230\u6d41\u4e4b\u95f4\u7684\u8f6c\u6362\uff1a\u6bd4\u5982 filter(\u8fc7\u6ee4), map(\u6620\u5c04\u8f6c\u6362), mapTo[Int|Long|Double] (\u5230\u539f\u5b50\u7c7b\u578b\u6d41\u7684\u8f6c\u6362), flatMap(\u9ad8\u7ef4\u7ed3\u6784\u5e73\u94fa)\uff0cflatMapTo[Int|Long|Double], sorted(\u6392\u5e8f)\uff0cdistinct(\u4e0d\u91cd\u590d\u503c)\uff0cpeek(\u6267\u884c\u67d0\u79cd\u64cd\u4f5c\uff0c\u6d41\u4e0d\u53d8\uff0c\u53ef\u7528\u4e8e\u8c03\u8bd5)\uff0climit(\u9650\u5236\u5230\u6307\u5b9a\u5143\u7d20\u6570\u91cf), skip(\u8df3\u8fc7\u82e5\u5e72\u5143\u7d20) \uff1b<\/li>\n<li>\u6d41\u5230\u7ec8\u503c\u7684\u8f6c\u6362\uff1a \u6bd4\u5982 toArray\uff08\u8f6c\u4e3a\u6570\u7ec4\uff09\uff0creduce\uff08\u63a8\u5bfc\u7ed3\u679c\uff09\uff0ccollect\uff08\u805a\u5408\u7ed3\u679c\uff09\uff0cmin(\u6700\u5c0f\u503c), max(\u6700\u5927\u503c), count (\u5143\u7d20\u4e2a\u6570)\uff0c anyMatch (\u4efb\u4e00\u5339\u914d), allMatch(\u6240\u6709\u90fd\u5339\u914d)\uff0c noneMatch(\u4e00\u4e2a\u90fd\u4e0d\u5339\u914d)\uff0c findFirst\uff08\u9009\u62e9\u9996\u5143\u7d20\uff09\uff0cfindAny(\u4efb\u9009\u4e00\u5143\u7d20) \uff1b<\/li>\n<li>\u76f4\u63a5\u904d\u5386\uff1a forEach (\u4e0d\u4fdd\u5e8f\u904d\u5386\uff0c\u6bd4\u5982\u5e76\u884c\u6d41), forEachOrdered\uff08\u4fdd\u5e8f\u904d\u5386) \uff1b<\/li>\n<li>\u6784\u9020\u6d41\uff1a empty (\u6784\u9020\u7a7a\u6d41)\uff0cof (\u5355\u4e2a\u5143\u7d20\u7684\u6d41\u53ca\u591a\u5143\u7d20\u987a\u5e8f\u6d41)\uff0citerate (\u65e0\u9650\u957f\u5ea6\u7684\u6709\u5e8f\u987a\u5e8f\u6d41)\uff0cgenerate (\u5c06\u6570\u636e\u63d0\u4f9b\u5668\u8f6c\u6362\u6210\u65e0\u9650\u975e\u6709\u5e8f\u7684\u987a\u5e8f\u6d41)\uff0c concat (\u6d41\u7684\u8fde\u63a5)\uff0c Builder (\u7528\u4e8e\u6784\u9020\u6d41\u7684Builder\u5bf9\u8c61)<\/li>\n<\/ul>\n<p>\u9664\u4e86 Stream \u672c\u8eab\u81ea\u5e26\u7684\u751f\u6210Stream \u7684\u65b9\u6cd5\uff0c\u6570\u7ec4\u548c\u5bb9\u5668\u53caStreamSupport\u90fd\u6709\u8f6c\u6362\u4e3a\u6d41\u7684\u65b9\u6cd5\u3002\u6bd4\u5982 Arrays.stream , [List|Set|Collection].[stream|parallelStream] , StreamSupport.[int|long|double|]stream\uff1b<\/p>\n<p>\u6d41\u7684\u7c7b\u578b\u4e3b\u8981\u6709\uff1aReference(\u5bf9\u8c61\u6d41)\uff0c IntStream (int\u5143\u7d20\u6d41), LongStream (long\u5143\u7d20\u6d41)\uff0c Double (double\u5143\u7d20\u6d41) \uff0c\u5b9a\u4e49\u5728\u7c7b StreamShape \u4e2d\uff0c\u4e3b\u8981\u5c06\u64cd\u4f5c\u9002\u914d\u4e8e\u7c7b\u578b\u7cfb\u7edf\u3002<\/p>\n<p>flatMap \u7684\u4e00\u4e2a\u4f8b\u5b50\u89c1\u5982\u4e0b\u6240\u793a\uff0c\u5c06\u4e00\u4e2a\u4e8c\u7ef4\u6570\u7ec4\u8f6c\u6362\u4e3a\u4e00\u7ef4\u6570\u7ec4\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\">     List&lt;Integer&gt; nums = Arrays.<span class=\"fu\">asList<\/span>(Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">3<\/span><\/span>), Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">4<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">9<\/span><\/span>), Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">8<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">27<\/span><\/span>))\r\n                                .<span class=\"fu\">stream<\/span>().<span class=\"fu\">flatMap<\/span>(x -&gt; x.<span class=\"fu\">stream<\/span>()).<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>());\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(nums);<\/code><\/pre>\n<\/div>\n<h4 id=\"collector\u5b9e\u73b0\">collector\u5b9e\u73b0<\/h4>\n<p>\u8fd9\u91cc\u6211\u4eec\u4ec5\u5206\u6790\u4e32\u884c\u662f\u600e\u4e48\u5b9e\u73b0\u7684\u3002\u5165\u53e3\u5728\u7c7b java.util.stream.ReferencePipeline \u7684 collect \u65b9\u6cd5\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\">container = <span class=\"fu\">evaluate<\/span>(ReduceOps.<span class=\"fu\">makeRef<\/span>(collector));\r\n<span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> collector.<span class=\"fu\">characteristics<\/span>().<span class=\"fu\">contains<\/span>(Collector.<span class=\"fu\">Characteristics<\/span>.<span class=\"fu\">IDENTITY_FINISH<\/span>)\r\n          ? (R) container : collector.<span class=\"fu\">finisher<\/span>().<span class=\"fu\">apply<\/span>(container);<\/code><\/pre>\n<\/div>\n<p>\u8fd9\u91cc\u7684\u5173\u952e\u662f ReduceOps.makeRef(collector)\u3002 \u70b9\u8fdb\u53bb\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T, I&gt; <span class=\"hljs-function\">TerminalOp&lt;T, I&gt;\r\n    <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">makeRef<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(Collector&lt;? <\/span><\/span><span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-keyword\">super<\/span><\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\"> T, I, ?&gt; collector)<\/span> <\/span>{\r\n        Supplier&lt;I&gt; supplier = Objects.<span class=\"fu\">requireNonNull<\/span>(collector).<span class=\"fu\">supplier<\/span>();\r\n        BiConsumer&lt;I, ? <span class=\"kw\"><span class=\"hljs-keyword\">super<\/span><\/span> T&gt; accumulator = collector.<span class=\"fu\">accumulator<\/span>();\r\n        BinaryOperator&lt;I&gt; combiner = collector.<span class=\"fu\">combiner<\/span>();\r\n        <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">ReducingSink<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">extends<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Box<\/span>&lt;<span class=\"hljs-title\">I<\/span>&gt;\r\n                <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">AccumulatingSink<\/span>&lt;<span class=\"hljs-title\">T<\/span>, <span class=\"hljs-title\">I<\/span>, <span class=\"hljs-title\">ReducingSink<\/span>&gt; <\/span>{\r\n            <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n            <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">begin<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(<\/span><\/span><span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-keyword\">long<\/span><\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\"> size)<\/span> <\/span>{\r\n                state = supplier.<span class=\"fu\">get<\/span>();\r\n            }\r\n\r\n            <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n            <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">accept<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(T t)<\/span> <\/span>{\r\n                accumulator.<span class=\"fu\">accept<\/span>(state, t);\r\n            }\r\n\r\n            <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n            <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">combine<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(ReducingSink other)<\/span> <\/span>{\r\n                state = combiner.<span class=\"fu\">apply<\/span>(state, other.<span class=\"fu\">state<\/span>);\r\n            }\r\n        }\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> ReduceOp&lt;T, I, ReducingSink&gt;(StreamShape.<span class=\"fu\">REFERENCE<\/span>) {\r\n            <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n            <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span><span class=\"hljs-function\"> ReducingSink <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">makeSink<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> <\/span>{\r\n                <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> <span class=\"fu\">ReducingSink<\/span>();\r\n            }\r\n\r\n            <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n            <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">int<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">getOpFlags<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> <\/span>{\r\n                <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> collector.<span class=\"fu\">characteristics<\/span>().<span class=\"fu\">contains<\/span>(Collector.<span class=\"fu\">Characteristics<\/span>.<span class=\"fu\">UNORDERED<\/span>)\r\n                       ? StreamOpFlag.<span class=\"fu\">NOT_ORDERED<\/span>\r\n                       : <span class=\"dv\"><span class=\"hljs-number\">0<\/span><\/span>;\r\n            }\r\n        };\r\n    }\r\n\r\n<span class=\"kw\"><span class=\"hljs-keyword\">private<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">abstract<\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Box<\/span>&lt;<span class=\"hljs-title\">U<\/span>&gt; <\/span>{\r\n        U state;\r\n\r\n        Box() {} <span class=\"co\"><span class=\"hljs-comment\">\/\/ Avoid creation of special accessor<\/span><\/span>\r\n\r\n        <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span><span class=\"hljs-function\"> U <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">get<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> <\/span>{\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> state;\r\n        }\r\n    }<\/code><\/pre>\n<\/div>\n<p>Box \u662f\u4e00\u4e2a\u7ed3\u679c\u503c\u7684\u6301\u6709\u8005\uff1b ReducingSink \u7528begin, accept, combine \u4e09\u4e2a\u65b9\u6cd5\u5b9a\u4e49\u4e86\u8981\u8fdb\u884c\u7684\u8ba1\u7b97\uff1bReducingSink\u662f\u6709\u72b6\u6001\u7684\u6d41\u6570\u636e\u6d88\u8d39\u7684\u8ba1\u7b97\u62bd\u8c61\uff0c\u9605\u8bfbSink\u63a5\u53e3\u6587\u6863\u53ef\u77e5\u3002ReduceOps.makeRef(collector) \u8fd4\u56de\u4e86\u4e00\u4e2a\u5c01\u88c5\u4e86Reduce\u64cd\u4f5c\u7684ReduceOps\u5bf9\u8c61\u3002\u6ce8\u610f\u5230\uff0c\u8fd9\u91cc\u90fd\u662f\u58f0\u660e\u8981\u6267\u884c\u7684\u8ba1\u7b97\uff0c\u800c\u4e0d\u6d89\u53ca\u8ba1\u7b97\u7684\u5b9e\u9645\u8fc7\u7a0b\u3002\u5c55\u793a\u4e86<strong>\u8868\u8fbe\u4e0e\u6267\u884c\u5206\u79bb<\/strong>\u7684\u601d\u60f3\u3002\u771f\u6b63\u7684\u8ba1\u7b97\u8fc7\u7a0b\u542f\u52a8\u5728 ReferencePipeline.evaluate \u65b9\u6cd5\u91cc:<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"dt\"><span class=\"hljs-keyword\">final<\/span><\/span> &lt;R&gt; <span class=\"hljs-function\">R <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">evaluate<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(TerminalOp&lt;E_OUT, R&gt; terminalOp)<\/span> <\/span>{\r\n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">assert<\/span> <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">getOutputShape<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> <\/span>== terminalOp.<span class=\"fu\">inputShape<\/span>();\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (linkedOrConsumed)\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">throw<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> IllegalStateException(MSG_STREAM_LINKED);\r\n        linkedOrConsumed = <span class=\"kw\"><span class=\"hljs-keyword\">true<\/span><\/span>;\r\n\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"fu\">isParallel<\/span>()\r\n               ? terminalOp.<span class=\"fu\">evaluateParallel<\/span>(<span class=\"kw\"><span class=\"hljs-keyword\">this<\/span><\/span>, <span class=\"fu\">sourceSpliterator<\/span>(terminalOp.<span class=\"fu\">getOpFlags<\/span>()))\r\n               : terminalOp.<span class=\"fu\">evaluateSequential<\/span>(<span class=\"kw\"><span class=\"hljs-keyword\">this<\/span><\/span>, <span class=\"fu\">sourceSpliterator<\/span>(terminalOp.<span class=\"fu\">getOpFlags<\/span>()));\r\n    }<\/code><\/pre>\n<\/div>\n<p>\u4f7f\u7528 IDE \u7684 go to implementations \u529f\u80fd\uff0c \u8ddf\u8fdb\u53bb\uff0c\u53ef\u4ee5\u53d1\u73b0\uff0c\u6700\u7ec8\u5728 AbstractPipeLine \u4e2d\u5b9a\u4e49\u4e86\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n    <span class=\"dt\"><span class=\"hljs-keyword\">final<\/span><\/span> &lt;P_IN&gt; <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">copyInto<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(Sink&lt;P_IN&gt; wrappedSink, Spliterator&lt;P_IN&gt; spliterator)<\/span> <\/span>{\r\n        Objects.<span class=\"fu\">requireNonNull<\/span>(wrappedSink);\r\n\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (!StreamOpFlag.<span class=\"fu\">SHORT_CIRCUIT<\/span>.<span class=\"fu\">isKnown<\/span>(<span class=\"fu\">getStreamAndOpFlags<\/span>())) {\r\n            wrappedSink.<span class=\"fu\">begin<\/span>(spliterator.<span class=\"fu\">getExactSizeIfKnown<\/span>());\r\n            spliterator.<span class=\"fu\">forEachRemaining<\/span>(wrappedSink);\r\n            wrappedSink.<span class=\"fu\">end<\/span>();\r\n        }\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">else<\/span><\/span> {\r\n            <span class=\"fu\">copyIntoWithCancel<\/span>(wrappedSink, spliterator);\r\n        }\r\n    }<\/code><\/pre>\n<\/div>\n<p>Spliterator \u7528\u6765\u5bf9\u6d41\u4e2d\u7684\u5143\u7d20\u8fdb\u884c\u5206\u533a\u548c\u904d\u5386\u4ee5\u53ca\u65bd\u52a0Sink\u6307\u5b9a\u64cd\u4f5c\uff0c\u53ef\u4ee5\u7528\u4e8e\u5e76\u53d1\u8ba1\u7b97\u3002Spliterator\u7684\u5177\u4f53\u5b9e\u73b0\u7c7b\u5b9a\u4e49\u5728 Spliterators \u7684\u9759\u6001\u7c7b\u548c\u9759\u6001\u65b9\u6cd5\u4e2d\u3002\u5176\u4e2d\u6709\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\">\u6570\u7ec4Spliterator:\r\n<span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">final<\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">ArraySpliterator<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt; <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt;\r\n<\/span><span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">final<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">IntArraySpliterator<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>.<\/span><span class=\"fu\"><span class=\"hljs-class\"><span class=\"hljs-title\">OfInt<\/span><\/span><\/span>\r\n<span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">final<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">LongArraySpliterator<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>.<\/span><span class=\"fu\"><span class=\"hljs-class\"><span class=\"hljs-title\">OfLong<\/span><\/span><\/span>\r\n<span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">final<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">DoubleArraySpliterator<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>.<\/span><span class=\"fu\"><span class=\"hljs-class\"><span class=\"hljs-title\">OfDouble<\/span><\/span><\/span><span class=\"hljs-class\">\r\n\r\n\u8fed\u4ee3<span class=\"hljs-title\">Spliterator<\/span>:\r\n<\/span><span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">IteratorSpliterator<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt; <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt;\r\n<\/span><span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">final<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">IntIteratorSpliterator<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>.<\/span><span class=\"fu\"><span class=\"hljs-class\"><span class=\"hljs-title\">OfInt<\/span><\/span><\/span>\r\n<span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">final<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">LongIteratorSpliterator<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>.<\/span><span class=\"fu\"><span class=\"hljs-class\"><span class=\"hljs-title\">OfLong<\/span><\/span><\/span>\r\n<span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">final<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">DoubleIteratorSpliterator<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>.<\/span><span class=\"fu\"><span class=\"hljs-class\"><span class=\"hljs-title\">OfDouble<\/span><\/span><\/span><span class=\"hljs-class\">\r\n\r\n\u62bd\u8c61<span class=\"hljs-title\">Spliterator<\/span>:\r\n<\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">abstract<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">AbstractSpliterator<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt; <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt;\r\n<\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">private<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">abstract<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">EmptySpliterator<\/span>&lt;<span class=\"hljs-title\">T<\/span>, <span class=\"hljs-title\">S<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">extends<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>&lt;<span class=\"hljs-title\">T<\/span>&gt;, <span class=\"hljs-title\">C<\/span>&gt;\r\n<\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">abstract<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">AbstractIntSpliterator<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>.<\/span><span class=\"fu\"><span class=\"hljs-class\"><span class=\"hljs-title\">OfInt<\/span><\/span><\/span>\r\n<span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">abstract<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">AbstractLongSpliterator<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>.<\/span><span class=\"fu\"><span class=\"hljs-class\"><span class=\"hljs-title\">OfLong<\/span><\/span><\/span>\r\n<span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">abstract<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">AbstractDoubleSpliterator<\/span> <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Spliterator<\/span>.<\/span><span class=\"fu\"><span class=\"hljs-class\"><span class=\"hljs-title\">OfDouble<\/span><\/span><\/span><\/code><\/pre>\n<\/div>\n<p>\u6bcf\u4e2a\u5177\u4f53\u7c7b\u90fd\u5b9e\u73b0\u4e86trySplit\uff0cforEachRemaining\uff0ctryAdvance\uff0cestimateSize\uff0ccharacteristics\uff0c getComparator\u3002 trySplit \u7528\u4e8e\u62c6\u5206\u6d41\uff0c\u63d0\u4f9b\u5e76\u53d1\u80fd\u529b\uff1bforEachRemaining\uff0ctryAdvance \u7528\u4e8e\u904d\u5386\u548c\u6d88\u8d39\u6d41\u4e2d\u7684\u6570\u636e\u3002\u4e0b\u9762\u5c55\u793a\u4e86IteratorSpliterator\u7684forEachRemaining\uff0ctryAdvance \u4e24\u4e2a\u65b9\u6cd5\u7684\u5b9e\u73b0\u3002\u53ef\u4ee5\u770b\u5230\uff0c\u6728\u6709\u7279\u522b\u7684\u5730\u65b9\uff0c\u5c31\u662f\u904d\u5386\u5143\u7d20\u5e76\u5c06\u6307\u5b9a\u64cd\u4f5c\u65bd\u52a0\u4e8e\u5143\u7d20\u3002<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n        <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">forEachRemaining<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(Consumer&lt;? <\/span><\/span><span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-keyword\">super<\/span><\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\"> T&gt; action)<\/span> <\/span>{\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (action == <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>) <span class=\"kw\"><span class=\"hljs-keyword\">throw<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> NullPointerException();\r\n            Iterator&lt;? <span class=\"kw\">extends<\/span> T&gt; i;\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> ((i = it) == <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>) {\r\n                i = it = collection.<span class=\"fu\">iterator<\/span>();\r\n                est = (<span class=\"dt\"><span class=\"hljs-keyword\">long<\/span><\/span>)collection.<span class=\"fu\">size<\/span>();\r\n            }\r\n            i.<span class=\"fu\">forEachRemaining<\/span>(action);\r\n        }\r\n\r\n        <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n        <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">boolean<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">tryAdvance<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(Consumer&lt;? <\/span><\/span><span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-keyword\">super<\/span><\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\"> T&gt; action)<\/span> <\/span>{\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (action == <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>) <span class=\"kw\"><span class=\"hljs-keyword\">throw<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> NullPointerException();\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (it == <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>) {\r\n                it = collection.<span class=\"fu\">iterator<\/span>();\r\n                est = (<span class=\"dt\"><span class=\"hljs-keyword\">long<\/span><\/span>) collection.<span class=\"fu\">size<\/span>();\r\n            }\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (it.<span class=\"fu\">hasNext<\/span>()) {\r\n                action.<span class=\"fu\">accept<\/span>(it.<span class=\"fu\">next<\/span>());\r\n                <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">true<\/span><\/span>;\r\n            }\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">false<\/span><\/span>;\r\n        }<\/code><\/pre>\n<\/div>\n<p>\u6574\u4f53\u6d41\u7a0b\u5c31\u662f\u8fd9\u6837\u3002\u56de\u987e\u4e00\u4e0b\uff1a<\/p>\n<ul>\n<li>Collector \u5b9a\u4e49\u4e86\u5fc5\u8981\u7684\u805a\u5408\u64cd\u4f5c\u51fd\u6570\uff1b<\/li>\n<li>ReduceOps.makeRef \u5c06 Collector \u5c01\u88c5\u6210\u4e00\u4e2a\u8ba1\u7b97\u5bf9\u8c61 ReduceOps \uff0c\u4f9d\u8d56\u7684 ReducingSink \u5b9a\u4e49\u4e86\u5177\u4f53\u7684\u6d41\u6570\u636e\u6d88\u8d39\u8fc7\u7a0b\uff1b<\/li>\n<li>Spliterator \u7528\u4e8e\u5bf9\u6d41\u4e2d\u7684\u5143\u7d20\u8fdb\u884c\u5206\u533a\u548c\u904d\u5386\u4ee5\u53ca\u65bd\u52a0Sink\u6307\u5b9a\u7684\u64cd\u4f5c\u3002<\/li>\n<\/ul>\n<h4 id=\"pipeline\">Pipeline<\/h4>\n<p>\u90a3\u4e48\uff0cSpliterator \u53c8\u662f\u4ece\u54ea\u91cc\u6765\u7684\u5462\uff1f\u662f\u901a\u8fc7\u7c7b java.util.stream.AbstractPipeline \u7684\u65b9\u6cd5 sourceSpliterator \u62ff\u5230\u7684\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">private<\/span><\/span> Spliterator&lt;?&gt; <span class=\"fu\">sourceSpliterator<\/span>(<span class=\"dt\"><span class=\"hljs-keyword\">int<\/span><\/span> terminalFlags) {\r\n        <span class=\"co\"><span class=\"hljs-comment\">\/\/ Get the source spliterator of the pipeline<\/span><\/span>\r\n        Spliterator&lt;?&gt; spliterator = <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>;\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (sourceStage.<span class=\"fu\">sourceSpliterator<\/span> != <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>) {\r\n            spliterator = sourceStage.<span class=\"fu\">sourceSpliterator<\/span>;\r\n            sourceStage.<span class=\"fu\">sourceSpliterator<\/span> = <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>;\r\n        }\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">else<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (sourceStage.<span class=\"fu\">sourceSupplier<\/span> != <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>) {\r\n            spliterator = (Spliterator&lt;?&gt;) sourceStage.<span class=\"fu\">sourceSupplier<\/span>.<span class=\"fu\">get<\/span>();\r\n            sourceStage.<span class=\"fu\">sourceSupplier<\/span> = <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>;\r\n        }\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">else<\/span><\/span> {\r\n            <span class=\"kw\"><span class=\"hljs-keyword\">throw<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> IllegalStateException(MSG_CONSUMED);\r\n        }\r\n        <span class=\"co\"><span class=\"hljs-comment\">\/\/ code for isParallel<\/span><\/span>\r\n       <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> spliterator;\r\n}<\/code><\/pre>\n<\/div>\n<p>\u8fd9\u91cc\u7684 sourceStage \u662f\u4e00\u4e2a AbstractPipeline\u3002 Pipeline \u662f\u5b9e\u73b0\u6d41\u5f0f\u8ba1\u7b97\u7684\u6d41\u6c34\u7ebf\u62bd\u8c61\uff0c\u4e5f\u662fStream\u7684\u5b9e\u73b0\u7c7b\u3002\u53ef\u4ee5\u770b\u5230\uff0cjava.util.stream \u5b9a\u4e49\u4e86\u56db\u79cd pipeline: DoublePipeline, IntPipeline, LongPipeline, ReferencePipeline\u3002\u53ef\u4ee5\u91cd\u70b9\u770b ReferencePipeline \u7684\u5b9e\u73b0\u3002\u6bd4\u5982 filter, map<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">abstract<\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">ReferencePipeline<\/span>&lt;<span class=\"hljs-title\">P_IN<\/span>, <span class=\"hljs-title\">P_OUT<\/span>&gt;\r\n        <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">extends<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">AbstractPipeline<\/span>&lt;<span class=\"hljs-title\">P_IN<\/span>, <span class=\"hljs-title\">P_OUT<\/span>, <span class=\"hljs-title\">Stream<\/span>&lt;<span class=\"hljs-title\">P_OUT<\/span>&gt;&gt;\r\n        <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">implements<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Stream<\/span>&lt;<span class=\"hljs-title\">P_OUT<\/span>&gt;\r\n\r\n<\/span><span class=\"fu\"><span class=\"hljs-class\">@<span class=\"hljs-title\">Override<\/span><\/span><\/span>\r\n    <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">final<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Stream<\/span>&lt;<span class=\"hljs-title\">P_OUT<\/span>&gt; <\/span><span class=\"fu\"><span class=\"hljs-class\"><span class=\"hljs-title\">filter<\/span><\/span><\/span><span class=\"hljs-class\">(<span class=\"hljs-title\">Predicate<\/span>&lt;? <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">super<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">P_OUT<\/span>&gt; <span class=\"hljs-title\">predicate<\/span>) <\/span>{\r\n        Objects.<span class=\"fu\">requireNonNull<\/span>(predicate);\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> StatelessOp&lt;P_OUT, P_OUT&gt;(<span class=\"kw\"><span class=\"hljs-keyword\">this<\/span><\/span>, StreamShape.<span class=\"fu\">REFERENCE<\/span>,\r\n                                     StreamOpFlag.<span class=\"fu\">NOT_SIZED<\/span>) {\r\n            <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n            <span class=\"hljs-function\">Sink&lt;P_OUT&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">opWrapSink<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(<\/span><\/span><span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-keyword\">int<\/span><\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\"> flags, Sink&lt;P_OUT&gt; sink)<\/span> <\/span>{\r\n                <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> Sink.<span class=\"fu\">ChainedReference<\/span>&lt;P_OUT, P_OUT&gt;(sink) {\r\n                    <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n                    <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">begin<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(<\/span><\/span><span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-keyword\">long<\/span><\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\"> size)<\/span> <\/span>{\r\n                        downstream.<span class=\"fu\">begin<\/span>(-<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>);\r\n                    }\r\n\r\n                    <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n                    <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">accept<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(P_OUT u)<\/span> <\/span>{\r\n                        <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (predicate.<span class=\"fu\">test<\/span>(u))\r\n                            downstream.<span class=\"fu\">accept<\/span>(u);\r\n                    }\r\n                };\r\n            }\r\n        };\r\n    }\r\n\r\n    <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n    <span class=\"fu\"><span class=\"hljs-meta\">@SuppressWarnings<\/span><\/span>(<span class=\"st\"><span class=\"hljs-string\">\"unchecked\"<\/span><\/span>)\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">final<\/span><\/span> &lt;R&gt; <span class=\"hljs-function\">Stream&lt;R&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">map<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(Function&lt;? <\/span><\/span><span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-keyword\">super<\/span><\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\"> P_OUT, ? <\/span><\/span><span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-params\">extends<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\"> R&gt; mapper)<\/span> <\/span>{\r\n        Objects.<span class=\"fu\">requireNonNull<\/span>(mapper);\r\n        <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> StatelessOp&lt;P_OUT, R&gt;(<span class=\"kw\"><span class=\"hljs-keyword\">this<\/span><\/span>, StreamShape.<span class=\"fu\">REFERENCE<\/span>,\r\n                                     StreamOpFlag.<span class=\"fu\">NOT_SORTED<\/span> | StreamOpFlag.<span class=\"fu\">NOT_DISTINCT<\/span>) {\r\n            <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n            <span class=\"hljs-function\">Sink&lt;P_OUT&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">opWrapSink<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(<\/span><\/span><span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-params\"><span class=\"hljs-keyword\">int<\/span><\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\"> flags, Sink&lt;R&gt; sink)<\/span> <\/span>{\r\n                <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> Sink.<span class=\"fu\">ChainedReference<\/span>&lt;P_OUT, R&gt;(sink) {\r\n                    <span class=\"fu\"><span class=\"hljs-meta\">@Override<\/span><\/span>\r\n                    <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">accept<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(P_OUT u)<\/span> <\/span>{\r\n                        downstream.<span class=\"fu\">accept<\/span>(mapper.<span class=\"fu\">apply<\/span>(u));\r\n                    }\r\n                };\r\n            }\r\n        };\r\n    }<\/code><\/pre>\n<\/div>\n<p>\u5957\u8def\u57fa\u672c\u4e00\u6837\uff0c\u5173\u952e\u70b9\u5728\u4e8e accept \u65b9\u6cd5\u3002filter \u53ea\u5728\u6ee1\u8db3\u6761\u4ef6\u65f6\u5c06\u503c\u4f20\u7ed9\u4e0b\u4e00\u4e2a pipeline, \u800c map \u5c06\u8ba1\u7b97\u7684\u503c\u4f20\u7ed9\u4e0b\u4e00\u4e2a pipeline. StatelessOp \u6ca1\u6709\u4ec0\u4e48\u903b\u8f91\uff0cJDK\u6587\u6863\u89e3\u91ca\u662f\uff1aBase class for a stateless intermediate stage of a Stream\u3002\u76f8\u5e94\u8fd8\u6709\u4e00\u4e2a StatefulOp, Head\u3002 \u8fd9\u4e9b\u90fd\u662f ReferencePipeline \uff0c\u8d1f\u8d23\u5c06\u503c\u5728 pipeline \u4e4b\u95f4\u4f20\u9012\uff0c\u4ea4\u7ed9 Sink \u53bb\u8ba1\u7b97\u3002<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">Head<\/span>&lt;<span class=\"hljs-title\">E_IN<\/span>, <span class=\"hljs-title\">E_OUT<\/span>&gt; <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">extends<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">ReferencePipeline<\/span>&lt;<span class=\"hljs-title\">E_IN<\/span>, <span class=\"hljs-title\">E_OUT<\/span>&gt;\r\n<\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">abstract<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">StatelessOp<\/span>&lt;<span class=\"hljs-title\">E_IN<\/span>, <span class=\"hljs-title\">E_OUT<\/span>&gt; <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">extends<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">ReferencePipeline<\/span>&lt;<span class=\"hljs-title\">E_IN<\/span>, <span class=\"hljs-title\">E_OUT<\/span>&gt;\r\n<\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">abstract<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-class\"><span class=\"hljs-title\">static<\/span><\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-title\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">StatefulOp<\/span>&lt;<span class=\"hljs-title\">E_IN<\/span>, <span class=\"hljs-title\">E_OUT<\/span>&gt; <\/span><span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">extends<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">ReferencePipeline<\/span>&lt;<span class=\"hljs-title\">E_IN<\/span>, <span class=\"hljs-title\">E_OUT<\/span>&gt;<\/span><\/code><\/pre>\n<\/div>\n<p>\u81f3\u6b64\uff0c\u6211\u4eec\u5bf9\u6574\u4e2a\u6d41\u8ba1\u7b97\u8fc7\u7a0b\u6709\u4e86\u66f4\u6e05\u6670\u7684\u8ba4\u8bc6\u3002 \u7ec6\u8282\u53ef\u4ee5\u518d\u9010\u6b65\u63a8\u6572\u3002<\/p>\n<h2 id=\"\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u76ca\u5904\">\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u76ca\u5904<\/h2>\n<h4 id=\"\u66f4\u7cbe\u7ec3\u7684\u4ee3\u7801\">\u66f4\u7cbe\u7ec3\u7684\u4ee3\u7801<\/h4>\n<p>\u51fd\u6570\u7f16\u7a0b\u7684\u4e00\u5927\u76ca\u5904\uff0c\u662f\u7528\u66f4\u7cbe\u7ec3\u7684\u4ee3\u7801\u8868\u8fbe\u5e38\u7528\u6570\u636e\u5904\u7406\u6a21\u5f0f\u3002\u51fd\u6570\u63a5\u53e3\u80fd\u591f\u8f7b\u6613\u5730\u5b9e\u73b0\u6a21\u677f\u65b9\u6cd5\u6a21\u5f0f\uff0c\u53ea\u8981\u5c06\u4e0d\u786e\u5b9a\u7684\u4e1a\u52a1\u903b\u8f91\u62bd\u8c61\u6210\u51fd\u6570\u63a5\u53e3\uff0c\u7136\u540e\u4f20\u5165\u4e0d\u540c\u7684lambda\u8868\u8fbe\u5f0f\u5373\u53ef\u3002\u535a\u6587<a href=\"http:\/\/www.cnblogs.com\/lovesqcc\/p\/7077971.html\" target=\"_blank\">\u201c\u7cbe\u7ec3\u4ee3\u7801\uff1a\u4e00\u6b21Java\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u91cd\u6784\u4e4b\u65c5\u201d<\/a>\u00a0\u5c55\u793a\u4e86\u5982\u4f55\u4f7f\u7528\u51fd\u6570\u5f0f\u7f16\u7a0b\u6765\u91cd\u6784\u5e38\u89c1\u4ee3\u7801\uff0c\u8403\u53d6\u66f4\u591a\u53ef\u590d\u7528\u7684\u4ee3\u7801\u6a21\u5f0f\u3002<\/p>\n<p>\u8fd9\u91cc\u7ed9\u51fa\u4e00\u4e2a\u5217\u8868\u5206\u7ec4\u7684\u4f8b\u5b50\u3002\u5b9e\u9645\u5e94\u7528\u5e38\u5e38\u9700\u8981\u5c06\u4e00\u4e2a\u5217\u8868 List[T] \u8f6c\u6362\u4e3a\u4e00\u4e2a Map[K, List[T]] \uff0c \u5176\u4e2d K \u662f\u901a\u8fc7\u67d0\u4e2a\u51fd\u6570\u6765\u5b9e\u73b0\u7684\u3002 \u770b\u4e0b\u9762\u4e00\u6bb5\u4ee3\u7801\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> Map&lt;String, List&lt;OneRecord&gt;&gt; <span class=\"fu\">buildRecordMap<\/span>(List&lt;OneRecord&gt; records, List&lt;String&gt; colKeys) {\r\n    Map&lt;String, List&lt;OneRecord&gt;&gt; recordMap = <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> HashMap&lt;&gt;();\r\n    records.<span class=\"fu\">forEach<\/span>(\r\n        record -&gt; {\r\n          String recordKey = <span class=\"fu\">buildRecordKey<\/span>(record.<span class=\"fu\">getFieldValues<\/span>(), colKeys);\r\n          <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (recordMap.<span class=\"fu\">get<\/span>(recordKey) == <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span>) {\r\n            recordMap.<span class=\"fu\">put<\/span>(recordKey, <span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> ArrayList&lt;OneRecord&gt;());\r\n          }\r\n          recordMap.<span class=\"fu\">get<\/span>(recordKey).<span class=\"fu\">add<\/span>(record);\r\n    });\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> recordMap;\r\n  }<\/code><\/pre>\n<\/div>\n<p>\u53ef\u4ee5\u4f7f\u7528 Collectors.groupingby \u6765\u7b80\u6d01\u5730\u5b9e\u73b0\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> Map&lt;String, List&lt;OneRecord&gt;&gt; <span class=\"fu\">buildRecordMapBrief<\/span>(List&lt;OneRecord&gt; records, List&lt;String&gt; colKeys) {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> records.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">groupingBy<\/span>(\r\n        record -&gt; <span class=\"fu\">buildRecordKey<\/span>(record.<span class=\"fu\">getFieldValues<\/span>(), colKeys)\r\n    ));\r\n  }<\/code><\/pre>\n<\/div>\n<blockquote><p>\u5f88\u591a\u5e38\u7528\u6570\u636e\u5904\u7406\u7b97\u6cd5\uff0c\u90fd\u53ef\u4ee5\u4f7f\u7528\u51fd\u6570\u5f0f\u7f16\u7a0b\u7684\u6d41\u5f0f\u8ba1\u7b97\u7b80\u6d01\u8868\u8fbe\u3002<\/p><\/blockquote>\n<h4 id=\"\u66f4\u901a\u7528\u7684\u4ee3\u7801\">\u66f4\u901a\u7528\u7684\u4ee3\u7801<\/h4>\n<p>\u4f7f\u7528\u51fd\u6570\u63a5\u53e3\uff0c\u7ed3\u5408\u6cdb\u578b\uff0c\u5f88\u5bb9\u6613\u7528\u7cbe\u7ec3\u7684\u4ee3\u7801\uff0c\u5199\u51fa\u975e\u5e38\u901a\u7528\u7684\u5de5\u5177\u65b9\u6cd5\u3002 \u5b9e\u9645\u5e94\u7528\u4e2d\uff0c\u5e38\u5e38\u4f1a\u6709\u8fd9\u6837\u7684\u9700\u6c42\uff1a \u6709\u4e24\u4e2a\u5bf9\u8c61\u5217\u8868srcList\u548cdestList\uff0c\u4e24\u4e2a\u5bf9\u8c61\u7c7b\u578b\u7684\u67d0\u4e2a\u5b57\u6bb5K\u5177\u6709\u76f8\u540c\u7684\u503c\uff1b\u9700\u8981\u6839\u636e\u8fd9\u4e2a\u76f8\u540c\u7684\u503c\u5408\u5e76\u5bf9\u5e94\u7684\u4e24\u4e2a\u5bf9\u8c61\u7684\u4fe1\u606f\u3002<\/p>\n<p>\u8fd9\u91cc\u7ed9\u51fa\u4e86\u4e00\u4e2a\u5217\u8868\u5408\u5e76\u51fd\u6570\uff0c\u53ef\u4ee5\u5c06\u4e00\u4e2a\u5bf9\u8c61\u5217\u8868\u5408\u5e76\u5230\u6307\u5b9a\u7684\u5bf9\u8c61\u5217\u8868\u4e2d\u3002\u5b9e\u73b0\u662f\uff1a \u5148\u5c06\u5f85\u5408\u5e76\u7684\u5217\u8868srcList\u6839\u636ekey\u503c\u51fd\u6570keyFunc\u6784\u5efa\u8d77srcMap,\u7136\u540e\u904d\u5386dest\u5217\u8868\u7684\u5bf9\u8c61R\uff0c\u5c06\u5f85\u5408\u5e76\u7684\u4fe1\u606fsrcMap[key]\u53caT\u901a\u8fc7\u5408\u5e76\u51fd\u6570mergeFunc\u751f\u6210\u7684\u65b0\u5bf9\u8c61R\u6dfb\u52a0\u5230\u6700\u7ec8\u7ed3\u679c\u5217\u8868\u3002<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\">  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;K,R&gt; <span class=\"hljs-function\">List&lt;R&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">mergeList<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(List&lt;R&gt; srcList, List&lt;R&gt; destList ,\r\n                                        Function&lt;R,K&gt; keyFunc,\r\n                                        BinaryOperator&lt;R&gt; mergeFunc)<\/span> <\/span>{\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"fu\">mergeList<\/span>(srcList, destList, keyFunc, keyFunc, mergeFunc);\r\n  }\r\n\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,S,K,R&gt; <span class=\"hljs-function\">List&lt;R&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">mergeList<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(List&lt;S&gt; srcList, List&lt;T&gt; destList ,\r\n                                            Function&lt;S,K&gt; skeyFunc, Function&lt;T,K&gt; dkeyFunc,\r\n                                            BiFunction&lt;S,T,R&gt; mergeFunc)<\/span> <\/span>{\r\n\r\n    Map&lt;K,S&gt; srcMap = srcList.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toMap<\/span>(skeyFunc, s -&gt; s, (k1,k2) -&gt; k1));\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> destList.<span class=\"fu\">stream<\/span>().<span class=\"fu\">map<\/span>(\r\n        dest -&gt; {\r\n          K key = dkeyFunc.<span class=\"fu\">apply<\/span>(dest);\r\n          S src = srcMap.<span class=\"fu\">get<\/span>(key);\r\n          <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> mergeFunc.<span class=\"fu\">apply<\/span>(src, dest);\r\n        }\r\n    ).<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>());\r\n\r\n  }<\/code><\/pre>\n<\/div>\n<h4 id=\"\u66f4\u53ef\u6d4b\u7684\u4ee3\u7801\">\u66f4\u53ef\u6d4b\u7684\u4ee3\u7801<\/h4>\n<p>\u4f7f\u7528\u51fd\u6570\u63a5\u53e3\u53ef\u4ee5\u65b9\u4fbf\u5730\u9694\u79bb\u5916\u90e8\u4f9d\u8d56\uff0c\u4f7f\u5f97\u7c7b\u548c\u5bf9\u8c61\u7684\u65b9\u6cd5\u66f4\u7eaf\u7cb9\u3001\u66f4\u5177\u53ef\u6d4b\u6027\u3002\u535a\u6587\u201c<a href=\"http:\/\/www.cnblogs.com\/lovesqcc\/p\/6917448.html\" target=\"_blank\">\u4f7f\u7528Java\u51fd\u6570\u63a5\u53e3\u53calambda\u8868\u8fbe\u5f0f\u9694\u79bb\u548c\u6a21\u62df\u5916\u90e8\u4f9d\u8d56\u66f4\u5bb9\u6613\u6ef4\u5355\u6d4b<\/a>\u201d\uff0c\u201c<a href=\"http:\/\/www.cnblogs.com\/lovesqcc\/p\/7898319.html\" target=\"_blank\">\u6539\u5584\u4ee3\u7801\u53ef\u6d4b\u6027\u7684\u82e5\u5e72\u6280\u5de7<\/a>\u201d\u96c6\u4e2d\u8ba8\u8bba\u4e86\u5982\u4f55\u4f7f\u7528\u51fd\u6570\u63a5\u53e3\u63d0\u5347\u4ee3\u7801\u7684\u53ef\u5355\u6d4b\u6027\u3002<\/p>\n<h4 id=\"\u7ec4\u5408\u7684\u529b\u91cf\">\u7ec4\u5408\u7684\u529b\u91cf<\/h4>\n<p>\u51fd\u6570\u7f16\u7a0b\u7684\u5f3a\u5927\u5a01\u529b\uff0c\u5728\u4e8e\u5c06\u51fd\u6570\u63a5\u53e3\u7ec4\u5408\u8d77\u6765\uff0c\u6784\u5efa\u66f4\u5f3a\u5927\u66f4\u5177\u6709\u901a\u7528\u6027\u7684\u5b9e\u7528\u5de5\u5177\u65b9\u6cd5\u3002<strong>\u8d85\u8d8a\u7c7b\u578b\uff0c\u8d85\u8d8a\u64cd\u4f5c\u4e0e\u6570\u636e\u7684\u8fb9\u754c\u3002<\/strong><\/p>\n<p>\u524d\u9762\u63d0\u5230\uff0c\u51fd\u6570\u63a5\u53e3\u5c31\u662f\u6570\u636e\u8f6c\u6362\u5668\u3002\u6bd4\u5982Function&lt;T,R&gt; \u5c31\u662f\u201c\u5c06T\u5bf9\u8c61\u8f6c\u6362\u6210R\u5bf9\u8c61\u7684\u884c\u4e3a\u6216\u6570\u636e\u8f6c\u6362\u5668\u201d\u3002\u5bf9\u4e8e\u5b9e\u9645\u5de5\u7a0b\u5e94\u7528\u7684\u666e\u901a\u7ea7\u51fd\u6570\u7f16\u7a0b\u8db3\u591f\u4e86\u3002\u4e0d\u8fc7\uff0c\u8981\u73a9\u8f6c\u51fd\u6570\u63a5\u53e3\uff0c\u5c31\u8981\u5347\u7ea7\u4e0b\u8ba4\u8bc6\u3002 \u6bd4\u5982 Function&lt;BiFunction&lt;S,Q,R&gt;, Function&lt;T,R&gt;&gt; \u8be5\u600e\u4e48\u7406\u89e3\u5462\uff1f\u8fd9\u662f\u201c\u4e00\u4e2a\u4e00\u5143\u51fd\u6570g(h(s,q)) \uff0c\u53c2\u6570\u6307\u5b9a\u7684\u4e8c\u5143\u51fd\u6570h(s,q)\u5e94\u7528\u4e8e\u6307\u5b9a\u7684\u4e24\u4e2a\u53c2\u6570S,Q\uff0c\u5f97\u5230\u4e00\u4e2a\u4e00\u5143\u51fd\u6570f(t)\uff0c\u8fd9\u4e2a\u51fd\u6570\u63a5\u6536\u4e00\u4e2aT\u5bf9\u8c61\uff0c\u8fd4\u56de\u4e00\u4e2aR\u5bf9\u8c61\u201d\u3002 \u5982\u4e0b\u4ee3\u7801\u6240\u793a\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\">  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,S,Q,R&gt; Function&lt;BiFunction&lt;S,Q,R&gt;, Function&lt;T,R&gt;&gt; <span class=\"fu\">op<\/span>(Function&lt;T,S&gt; funcx, Function&lt;T,Q&gt; funcy) {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> opFunc -&gt; aT -&gt; opFunc.<span class=\"fu\">apply<\/span>(funcx.<span class=\"fu\">apply<\/span>(aT), funcy.<span class=\"fu\">apply<\/span>(aT));\r\n  }\r\n\r\n  System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(<span class=\"fu\">op<\/span>(x-&gt; x.<span class=\"fu\">toString<\/span>().<span class=\"fu\">length<\/span>(), y-&gt; y+<span class=\"st\"><span class=\"hljs-string\">\",world\"<\/span><\/span>).<span class=\"fu\">apply<\/span>((x,y) -&gt; x+<span class=\"st\"><span class=\"hljs-string\">\" \"<\/span><\/span> +y).<span class=\"fu\">apply<\/span>(<span class=\"st\"><span class=\"hljs-string\">\"hello\"<\/span><\/span>));<\/code><\/pre>\n<\/div>\n<p>\u5b9e\u73b0\u7684\u662f h(t) = h(funx(t), funy(t)) \uff0ch(x,y) \u662f\u4e00\u4e2a\u53cc\u53c2\u6570\u51fd\u6570\u3002<\/p>\n<p><a href=\"http:\/\/www.cnblogs.com\/lovesqcc\/p\/7107558.html\" target=\"_blank\">\u201cJava\u51fd\u6570\u63a5\u53e3\u5b9e\u73b0\u51fd\u6570\u7ec4\u5408\u53ca\u88c5\u9970\u5668\u6a21\u5f0f\u201d<\/a>\u00a0\u5c55\u793a\u4e86\u5982\u4f55\u4f7f\u7528\u6781\u5c11\u91cf\u7684\u4ee3\u7801\u5b9e\u73b0\u88c5\u9970\u5668\u6a21\u5f0f\uff0c\u5c06\u7b80\u5355\u7684\u51fd\u6570\u63a5\u53e3\u7ec4\u5408\u6210\u66f4\u5f3a\u5927\u529f\u80fd\u7684\u590d\u5408\u51fd\u6570\u63a5\u53e3\u3002<\/p>\n<p>\u6765\u770b\u4e0a\u9762\u7684\u00a0<code>public static &lt;T,S,K,R&gt; List&lt;R&gt; mergeList(List&lt;S&gt; srcList, List&lt;T&gt; destList , Function&lt;S,K&gt; skeyFunc, Function&lt;T,K&gt; dkeyFunc,BiFunction&lt;S,T,R&gt; mergeFunc)<\/code>\uff0c \u901a\u7528\u6027\u867d\u597d\uff0c\u53ef\u662f\u67095\u4e2a\u53c2\u6570\uff0c\u6709\u70b9\u4e11\u3002\u600e\u4e48\u6539\u9020\u4e0b\u5462\uff1f \u770b\u5b9e\u73b0\uff0c\u4e3b\u8981\u5305\u542b\u4e24\u6b65\uff1a1. \u5c06\u5f85\u5408\u5e76\u5217\u8868\u8f6c\u5316\u4e3a srcMap: map&lt;K,S&gt;; 2. \u4f7f\u7528\u6307\u5b9a\u7684\u51fd\u6570 dKeyFunc, mergeFunc \u4f5c\u7528\u4e8edestList\u548csrcMap\uff0c\u5f97\u5230\u6700\u7ec8\u7ed3\u679c\u3002\u53ef\u4ee5\u6539\u5199\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,S,K,R&gt; <span class=\"hljs-function\">List&lt;R&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">mergeList<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(List&lt;S&gt; srcList, List&lt;T&gt; destList ,\r\n                                          Function&lt;S,K&gt; skeyFunc, Function&lt;T,K&gt; dkeyFunc,\r\n                                          BiFunction&lt;S,T,R&gt; mergeFunc)<\/span> <\/span>{\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"fu\">join<\/span>(destList, <span class=\"fu\">mapKey<\/span>(srcList, skeyFunc)).<span class=\"fu\">apply<\/span>(dkeyFunc, (BiFunction) mergeFunc);\r\n\r\n  }\r\n\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,K&gt; <span class=\"hljs-function\">Map&lt;K,T&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">mapKey<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(List&lt;T&gt; list, Function&lt;T,K&gt; keyFunc)<\/span> <\/span>{\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toMap<\/span>(keyFunc, t -&gt; t, (k1,k2) -&gt; k1));\r\n  }\r\n\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,S,K,R&gt; BiFunction&lt;Function&lt;T,K&gt;, BiFunction&lt;S,T,R&gt;, List&lt;R&gt;&gt; <span class=\"fu\">join<\/span>(List&lt;T&gt; destList, Map&lt;K,S&gt; srcMap) {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> (dkeyFunc,mergeFunc) -&gt; destList.<span class=\"fu\">stream<\/span>().<span class=\"fu\">map<\/span>(\r\n        dest -&gt; {\r\n          K key = dkeyFunc.<span class=\"fu\">apply<\/span>(dest);\r\n          S src = srcMap.<span class=\"fu\">get<\/span>(key);\r\n          <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> mergeFunc.<span class=\"fu\">apply<\/span>(src, dest);\r\n        }).<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>());\r\n  }\r\n\r\nSystem.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(<span class=\"fu\">mergeList<\/span>(Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>), Arrays.<span class=\"fu\">asList<\/span>(<span class=\"st\"><span class=\"hljs-string\">\"an\"<\/span><\/span>, <span class=\"st\"><span class=\"hljs-string\">\"a\"<\/span><\/span>), s-&gt; s, t-&gt; t.<span class=\"fu\">toString<\/span>().<span class=\"fu\">length<\/span>(), (s,t) -&gt; s+t));<\/code><\/pre>\n<\/div>\n<p>mapKey \u662f\u4e00\u4e2a\u901a\u7528\u51fd\u6570\uff0c\u7528\u4e8e\u5c06\u4e00\u4e2a list \u6309\u7167\u6307\u5b9a\u7684 keyFunc \u8f6c\u6210\u4e00\u4e2a Map; join \u51fd\u6570\u63a5\u53d7\u4e00\u4e2a list \u548c\u5f85\u5408\u5e76\u7684 srcMap, \u8fd4\u56de\u4e00\u4e2a\u4e8c\u5143\u51fd\u6570\uff0c\u8be5\u51fd\u6570\u4f7f\u7528\u6307\u5b9a\u7684 dkeyFunc \u548c mergeFunc \u6765\u5408\u5e76\u6307\u5b9a\u6570\u636e\u5f97\u5230\u6700\u7ec8\u7684\u7ed3\u679c\u5217\u8868\u3002\u8fd9\u53ef\u79f0\u4e4b\u4e3a\u201c\u5ef6\u8fdf\u6307\u5b9a\u884c\u4e3a\u201d\u3002\u73b0\u5728, mapKey \u548c join \u90fd\u662f\u901a\u7528\u6027\u51fd\u6570\u3002Amazing \uff01<\/p>\n<h2 id=\"java8\u6cdb\u578b\">Java8\u6cdb\u578b<\/h2>\n<p>\u5728Java8\u51fd\u6570\u5f0f\u6846\u67b6\u7684\u89e3\u8bfb\u4e2d\uff0c\u53ef\u4ee5\u660e\u663e\u770b\u5230\uff0c\u6cdb\u578b\u65e0\u5904\u4e0d\u5728\u3002Java8\u7684\u6cdb\u578b\u63a8\u5bfc\u80fd\u529b\u4e5f\u6709\u5f88\u5927\u7684\u589e\u5f3a\u3002\u53ef\u4ee5\u8bf4\uff0c\u5982\u679c\u6ca1\u6709\u5f3a\u5927\u7684\u6cdb\u578b\u63a8\u5bfc\u652f\u6491\uff0c\u51fd\u6570\u63a5\u53e3\u7684\u5a01\u529b\u5c06\u4f1a\u5927\u6253\u6298\u6263\u3002<\/p>\n<h2 id=\"\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b\">\u5b8c\u6574\u4ee3\u7801\u793a\u4f8b<\/h2>\n<div class=\"sourceCode\">\n<pre class=\"sourceCode java\"><code class=\"sourceCode java hljs\"><span class=\"kw\"><span class=\"hljs-keyword\">package<\/span> zzz.study.function;<\/span>\r\n\r\n<span class=\"kw\"><span class=\"hljs-keyword\">import<\/span> java.util.Arrays;<\/span>\r\n<span class=\"kw\"><span class=\"hljs-keyword\">import<\/span> java.util.List;<\/span>\r\n<span class=\"kw\"><span class=\"hljs-keyword\">import<\/span> java.util.Map;<\/span>\r\n<span class=\"kw\"><span class=\"hljs-keyword\">import<\/span> java.util.function.BiFunction;<\/span>\r\n<span class=\"kw\"><span class=\"hljs-keyword\">import<\/span> java.util.function.BinaryOperator;<\/span>\r\n<span class=\"kw\"><span class=\"hljs-keyword\">import<\/span> java.util.function.Function;<\/span>\r\n<span class=\"kw\"><span class=\"hljs-keyword\">import<\/span> java.util.function.Supplier;<\/span>\r\n<span class=\"kw\"><span class=\"hljs-keyword\">import<\/span> java.util.stream.Collectors;<\/span>\r\n\r\n<span class=\"co\"><span class=\"hljs-comment\">\/**<\/span><\/span>\r\n<span class=\"co\"><span class=\"hljs-comment\"> * Created by shuqin on 17\/12\/3.<\/span><\/span>\r\n<span class=\"co\"><span class=\"hljs-comment\"> *\/<\/span><\/span>\r\n<span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"kw\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span><\/span><\/span><span class=\"hljs-class\"> <span class=\"hljs-title\">FunctionUtil<\/span> <\/span>{\r\n\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,R&gt; <span class=\"hljs-function\">List&lt;R&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">multiGetResult<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(List&lt;Function&lt;List&lt;T&gt;, R&gt;&gt; functions, List&lt;T&gt; list)<\/span> <\/span>{\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> functions.<span class=\"fu\">stream<\/span>().<span class=\"fu\">map<\/span>(f -&gt; f.<span class=\"fu\">apply<\/span>(list)).<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>());\r\n  }\r\n\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;K,R&gt; <span class=\"hljs-function\">List&lt;R&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">mergeList<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(List&lt;R&gt; srcList, List&lt;R&gt; destList ,\r\n                                        Function&lt;R,K&gt; keyFunc,\r\n                                        BinaryOperator&lt;R&gt; mergeFunc)<\/span> <\/span>{\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"fu\">mergeList<\/span>(srcList, destList, keyFunc, keyFunc, mergeFunc);\r\n  }\r\n\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,S,K,R&gt; <span class=\"hljs-function\">List&lt;R&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">mergeList<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(List&lt;S&gt; srcList, List&lt;T&gt; destList ,\r\n                                          Function&lt;S,K&gt; skeyFunc, Function&lt;T,K&gt; dkeyFunc,\r\n                                          BiFunction&lt;S,T,R&gt; mergeFunc)<\/span> <\/span>{\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> <span class=\"fu\">join<\/span>(destList, <span class=\"fu\">mapKey<\/span>(srcList, skeyFunc)).<span class=\"fu\">apply<\/span>(dkeyFunc, (BiFunction) mergeFunc);\r\n\r\n  }\r\n\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,K&gt; <span class=\"hljs-function\">Map&lt;K,T&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">mapKey<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(List&lt;T&gt; list, Function&lt;T,K&gt; keyFunc)<\/span> <\/span>{\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toMap<\/span>(keyFunc, t -&gt; t, (k1,k2) -&gt; k1));\r\n  }\r\n\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,S,K,R&gt; BiFunction&lt;Function&lt;T,K&gt;, BiFunction&lt;S,T,R&gt;, List&lt;R&gt;&gt; <span class=\"fu\">join<\/span>(List&lt;T&gt; destList, Map&lt;K,S&gt; srcMap) {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> (dkeyFunc,mergeFunc) -&gt; destList.<span class=\"fu\">stream<\/span>().<span class=\"fu\">map<\/span>(\r\n        dest -&gt; {\r\n          K key = dkeyFunc.<span class=\"fu\">apply<\/span>(dest);\r\n          S src = srcMap.<span class=\"fu\">get<\/span>(key);\r\n          <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> mergeFunc.<span class=\"fu\">apply<\/span>(src, dest);\r\n        }).<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>());\r\n  }\r\n\r\n  <span class=\"co\"><span class=\"hljs-comment\">\/** \u5bf9\u7ed9\u5b9a\u7684\u503c x,y \u5e94\u7528\u6307\u5b9a\u7684\u4e8c\u5143\u64cd\u4f5c\u51fd\u6570 *\/<\/span><\/span>\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,S,R&gt; Function&lt;BiFunction&lt;T,S,R&gt;, R&gt; <span class=\"fu\">op<\/span>(T x, S y) {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> opFunc -&gt; opFunc.<span class=\"fu\">apply<\/span>(x, y);\r\n  }\r\n\r\n  <span class=\"co\"><span class=\"hljs-comment\">\/** \u5c06\u4e24\u4e2a\u51fd\u6570\u4f7f\u7528\u7ec4\u5408\u6210\u4e00\u4e2a\u51fd\u6570\uff0c\u8fd9\u4e2a\u51fd\u6570\u63a5\u53d7\u4e00\u4e2a\u4e8c\u5143\u64cd\u4f5c\u51fd\u6570 *\/<\/span><\/span>\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,S,Q,R&gt; Function&lt;BiFunction&lt;S,Q,R&gt;, R&gt; <span class=\"fu\">op<\/span>(Function&lt;T,S&gt; funcx, Function&lt;T,Q&gt; funcy, T x) {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> opFunc -&gt; opFunc.<span class=\"fu\">apply<\/span>(funcx.<span class=\"fu\">apply<\/span>(x), funcy.<span class=\"fu\">apply<\/span>(x));\r\n  }\r\n\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T,S,Q,R&gt; Function&lt;BiFunction&lt;S,Q,R&gt;, Function&lt;T,R&gt;&gt; <span class=\"fu\">op<\/span>(Function&lt;T,S&gt; funcx, Function&lt;T,Q&gt; funcy) {\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> opFunc -&gt; aT -&gt; opFunc.<span class=\"fu\">apply<\/span>(funcx.<span class=\"fu\">apply<\/span>(aT), funcy.<span class=\"fu\">apply<\/span>(aT));\r\n  }\r\n\r\n  <span class=\"co\"><span class=\"hljs-comment\">\/** \u5c06\u4e24\u4e2a\u51fd\u6570\u7ec4\u5408\u6210\u4e00\u4e2a\u53e0\u52a0\u51fd\u6570, compose(f,g) = f(g) *\/<\/span><\/span>\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T&gt; <span class=\"hljs-function\">Function&lt;T, T&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">compose<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(Function&lt;T,T&gt; funcx, Function&lt;T,T&gt; funcy)<\/span> <\/span>{\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> x -&gt; funcx.<span class=\"fu\">apply<\/span>(funcy.<span class=\"fu\">apply<\/span>(x));\r\n  }\r\n\r\n  <span class=\"co\"><span class=\"hljs-comment\">\/** \u5c06\u82e5\u5e72\u4e2a\u51fd\u6570\u7ec4\u5408\u6210\u4e00\u4e2a\u53e0\u52a0\u51fd\u6570, compose(f1,f2,...fn) = f1(f2(...(fn))) *\/<\/span><\/span>\r\n  <span class=\"kw\"><span class=\"hljs-keyword\">public<\/span><\/span> <span class=\"dt\"><span class=\"hljs-keyword\">static<\/span><\/span> &lt;T&gt; <span class=\"hljs-function\">Function&lt;T, T&gt; <\/span><span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">compose<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(Function&lt;T,T&gt;<\/span><\/span><span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-params\">... <\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">extraFuncs)<\/span> <\/span>{\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">if<\/span><\/span> (extraFuncs == <span class=\"kw\"><span class=\"hljs-keyword\">null<\/span><\/span> || extraFuncs.<span class=\"fu\">length<\/span> == <span class=\"dv\"><span class=\"hljs-number\">0<\/span><\/span>) {\r\n      <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> x-&gt;x;\r\n    }\r\n    <span class=\"kw\"><span class=\"hljs-keyword\">return<\/span><\/span> x -&gt; Arrays.<span class=\"fu\">stream<\/span>(extraFuncs).<span class=\"fu\">reduce<\/span>(y-&gt;y, FunctionUtil::compose).<span class=\"fu\">apply<\/span>(x);\r\n  }\r\n\r\n   <span class=\"kw\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span><\/span><\/span> <span class=\"dt\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span><\/span><\/span> <span class=\"fu\"><span class=\"hljs-function\"><span class=\"hljs-title\">main<\/span><\/span><\/span><span class=\"hljs-function\"><span class=\"hljs-params\">(String[] args)<\/span> <\/span>{\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(<span class=\"fu\">multiGetResult<\/span>(\r\n         Arrays.<span class=\"fu\">asList<\/span>(\r\n             list -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">summarizingInt<\/span>(x-&gt;x)),\r\n             list -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">filter<\/span>(x -&gt; x &lt; <span class=\"dv\"><span class=\"hljs-number\">50<\/span><\/span>).<span class=\"fu\">sorted<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>()),\r\n             list -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">groupingBy<\/span>(x-&gt;(x%<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>==<span class=\"dv\"><span class=\"hljs-number\">0<\/span><\/span>? <span class=\"st\"><span class=\"hljs-string\">\"even\"<\/span><\/span>: <span class=\"st\"><span class=\"hljs-string\">\"odd\"<\/span><\/span>))),\r\n             list -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">sorted<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>()),\r\n             list -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">sorted<\/span>().<span class=\"fu\">map<\/span>(Math::sqrt).<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toMap<\/span>(x-&gt;x, y-&gt;Math.<span class=\"fu\">pow<\/span>(<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>,y)))),\r\n         Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">64<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">49<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">25<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">16<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">9<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">4<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">81<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">36<\/span><\/span>)));\r\n\r\n     List&lt;Integer&gt; list = Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">3<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">4<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">5<\/span><\/span>);\r\n     Supplier&lt;Map&lt;Integer,Integer&gt;&gt; mapSupplier = () -&gt; list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toMap<\/span>(x-&gt;x, y-&gt; y * y));\r\n\r\n     Map&lt;Integer, Integer&gt; mapValueAdd = list.<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toMap<\/span>(x-&gt;x, y-&gt;y, (v1,v2) -&gt; v1+v2, mapSupplier));\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(mapValueAdd);\r\n\r\n     List&lt;Integer&gt; nums = Arrays.<span class=\"fu\">asList<\/span>(Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">3<\/span><\/span>), Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">4<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">9<\/span><\/span>), Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">8<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">27<\/span><\/span>))\r\n                                .<span class=\"fu\">stream<\/span>().<span class=\"fu\">flatMap<\/span>(x -&gt; x.<span class=\"fu\">stream<\/span>()).<span class=\"fu\">collect<\/span>(Collectors.<span class=\"fu\">toList<\/span>());\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(nums);\r\n\r\n     List&lt;Integer&gt; fibo = Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">3<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">4<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">5<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">6<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">7<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">8<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">9<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">10<\/span><\/span>).<span class=\"fu\">stream<\/span>().<span class=\"fu\">collect<\/span>(<span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> <span class=\"fu\">FiboCollector<\/span>());\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(fibo);\r\n\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(<span class=\"fu\">op<\/span>(<span class=\"kw\"><span class=\"hljs-keyword\">new<\/span><\/span> Integer(<span class=\"dv\"><span class=\"hljs-number\">3<\/span><\/span>), Integer.<span class=\"fu\">valueOf<\/span>(<span class=\"dv\"><span class=\"hljs-number\">3<\/span><\/span>)).<span class=\"fu\">apply<\/span>((x,y) -&gt; x.<span class=\"fu\">equals<\/span>(y.<span class=\"fu\">toString<\/span>())));\r\n\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(<span class=\"fu\">op<\/span>(x-&gt; x.<span class=\"fu\">length<\/span>(), y-&gt; y+<span class=\"st\"><span class=\"hljs-string\">\",world\"<\/span><\/span>, <span class=\"st\"><span class=\"hljs-string\">\"hello\"<\/span><\/span>).<span class=\"fu\">apply<\/span>((x,y) -&gt; x+<span class=\"st\"><span class=\"hljs-string\">\" \"<\/span><\/span> +y));\r\n\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(<span class=\"fu\">op<\/span>(x-&gt; x, y-&gt; y+<span class=\"st\"><span class=\"hljs-string\">\",world\"<\/span><\/span>).<span class=\"fu\">apply<\/span>((x,y) -&gt; x+<span class=\"st\"><span class=\"hljs-string\">\" \"<\/span><\/span> +y).<span class=\"fu\">apply<\/span>(<span class=\"st\"><span class=\"hljs-string\">\"hello\"<\/span><\/span>));\r\n\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(<span class=\"fu\">op<\/span>(x-&gt; x.<span class=\"fu\">toString<\/span>().<span class=\"fu\">length<\/span>(), y-&gt; y+<span class=\"st\"><span class=\"hljs-string\">\",world\"<\/span><\/span>).<span class=\"fu\">apply<\/span>((x,y) -&gt; x+<span class=\"st\"><span class=\"hljs-string\">\" \"<\/span><\/span> +y).<span class=\"fu\">apply<\/span>(<span class=\"st\"><span class=\"hljs-string\">\"hello\"<\/span><\/span>));\r\n\r\n     System.<span class=\"fu\">out<\/span>.<span class=\"fu\">println<\/span>(<span class=\"fu\">mergeList<\/span>(Arrays.<span class=\"fu\">asList<\/span>(<span class=\"dv\"><span class=\"hljs-number\">1<\/span><\/span>,<span class=\"dv\"><span class=\"hljs-number\">2<\/span><\/span>), Arrays.<span class=\"fu\">asList<\/span>(<span class=\"st\"><span class=\"hljs-string\">\"an\"<\/span><\/span>, <span class=\"st\"><span class=\"hljs-string\">\"a\"<\/span><\/span>),\r\n                                  s-&gt; s, t-&gt; t.<span class=\"fu\">toString<\/span>().<span class=\"fu\">length<\/span>(), (s,t) -&gt; s+t));\r\n\r\n   }\r\n\r\n}<\/code><\/pre>\n<\/div>\n<h2 id=\"\u5c0f\u7ed3\">\u5c0f\u7ed3<\/h2>\n<p>\u672c\u6587\u6df1\u5165\u5b66\u4e60\u4e86Java8\u51fd\u6570\u5f0f\u7f16\u7a0b\u6846\u67b6\uff1aFunction&amp;Stream&amp;Collector\uff0c\u5e76\u5c55\u793a\u4e86\u51fd\u6570\u5f0f\u7f16\u7a0b\u5728\u5b9e\u9645\u5e94\u7528\u4e2d\u6240\u5e26\u6765\u7684\u8bf8\u591a\u76ca\u5904\u3002\u51fd\u6570\u5f0f\u7f16\u7a0b\u662f\u4e00\u628a\u5927\u950b\u82e5\u949d\u7684\u5947\u5251\u3002\u57fa\u4e8e\u51fd\u6570\u63a5\u53e3\u7f16\u7a0b\uff0c\u5c06\u51fd\u6570\u4f5c\u4e3a\u6570\u636e\u81ea\u7531\u4f20\u9012\uff0c\u7ed3\u5408\u6cdb\u578b\u63a8\u5bfc\u80fd\u529b\uff0c\u53ef\u7f16\u5199\u51fa\u7cbe\u7ec3\u3001\u901a\u7528\u3001\u6613\u6d4b\u7684\u4ee3\u7801\uff0c\u4f7f\u4ee3\u7801\u8868\u8fbe\u80fd\u529b\u83b7\u5f97\u98de\u4e00\u822c\u7684\u63d0\u5347\u3002<\/p>\n<p><a href=\"https:\/\/files.cnblogs.com\/files\/lovesqcc\/%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B%E5%88%86%E4%BA%AB.pdf\" target=\"_blank\">\u51fd\u6570\u5f0f\u7f16\u7a0b\u5206\u4eab<\/a><\/p>\n<div id=\"mycopyright\">\n<p>\u4f5c\u8005\uff1a<a href=\"https:\/\/github.com\/shuqin\" target=\"_blank\">@\u7434\u6c34\u7389<\/a><br \/>\n\u539f\u6587\u51fa\u5904\uff1a<a class=\"uri\" href=\"http:\/\/www.cnblogs.com\/lovesqcc\/p\/7965387.html\">http:\/\/www.cnblogs.com\/lovesqcc\/p\/7965387.html<\/a><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>[java]\u5f15\u5b50 \u5c06\u884c\u4e3a\u4f5c\u4e3a\u6570\u636e\u4f20\u9012 Java8\u51fd\u6570\u6846\u67b6\u89e3\u8bfb \u51fd\u6570\u63a5\u53e3 \u805a\u5408\u5668 Reduce \u56db\u8981\u7d20 \u5217\u8868\u7c7b\u805a [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[103],"tags":[],"_links":{"self":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/2250"}],"collection":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2250"}],"version-history":[{"count":3,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/2250\/revisions"}],"predecessor-version":[{"id":2253,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=\/wp\/v2\/posts\/2250\/revisions\/2253"}],"wp:attachment":[{"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2250"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2250"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ai.zhousir.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}