{"@attributes":{"version":"2.0"},"channel":{"title":"Java8 on \u9694\u53f6\u9ec4\u83ba Yanbin's Blog - \u8f6f\u4ef6\u7f16\u7a0b\u5b9e\u8df5","link":"https:\/\/yanbin.blog\/categories\/java8\/","description":"Recent content in Java8 on \u9694\u53f6\u9ec4\u83ba Yanbin's Blog - \u8f6f\u4ef6\u7f16\u7a0b\u5b9e\u8df5","generator":"Hugo -- gohugo.io","language":"en-us","managingEditor":"yabqiu@gmail.com (Yanbin Qiu)","webMaster":"yabqiu@gmail.com (Yanbin Qiu)","copyright":"Yanbin \u9694\u53f6\u9ec4\u83ba","lastBuildDate":"Wed, 03 Jul 2019 21:20:27 -0500","item":[{"title":"\u8f6c\u6362 Iterator \u4e3a Java 8 \u7684 Stream","link":"https:\/\/yanbin.blog\/convert-iterator-to-java-8-stream\/","pubDate":"Wed, 03 Jul 2019 21:20:27 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/convert-iterator-to-java-8-stream\/","description":"\n<p>Java \u4e2d\u6709\u5173\u62bd\u8c61\u7684\u53ef\u904d\u5386\u7684\u5bf9\u8c61\u6709 Iterator, Iterable \u548c Java 8 \u7684 Stream, Iterable \u53ef\u7b80\u5355\u7684\u7528\u5982\u4e0b\u4ee3\u7801\u8f6c\u6362\u4e3a\u00a0Stream<\/p>\n<blockquote>\n<p>StreamSupport.stream(iterable.spliterator(), false)<\/p>\n<\/blockquote>\n<p>\u518d\u56de\u8fc7\u5934\u6765\uff0c\u4e3a\u4ec0\u4e48\u8981\u628a Iterator \u6216 Iterable \u8f6c\u6362\u4e3a Stream, \u56e0\u4e3a Iterator \u548c Iterable \u53ea\u63d0\u4f9b\u6709\u9650\u7684\u904d\u5386\u64cd\u4f5c\uff0c\u5982 Iterator \u63a5\u53e3\u7684\u5168\u90e8\u56db\u4e2a\u65b9\u6cd5<\/p>\n<blockquote>\n<p>hasNext()<br \/>\nnext()<br \/>\nforEachRemaining(consumer)<br \/>\nremove()<\/p>\n<\/blockquote>\n<p>\u540c\u6837 Iterable \u4e5f\u53ea\u6709 <code>iterator()<\/code>, <code>forEach(consumer)<\/code>, \u548c <code>spliterator()<\/code> \u65b9\u6cd5\u3002\u800c Java 8 \u7684 Stream \u5c31\u5927\u4e0d\u4e00\u6837\u7684\uff0c\u5e26\u6709\u5927\u91cf\u7684\u94fe\u5f0f\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5982 filter, map, flatMap, collect \u7b49\u3002<\/p>\n<p>\u56e0\u6b64\u5982\u679c\u6211\u4eec\u5df2\u6709\u4e00\u4e2a Iterator \u7c7b\u578b\uff0c\u80fd\u591f\u88ab\u8f6c\u6362\u4e3a Stream \u7c7b\u578b\u7684\u8bdd\u5c06\u4f1a\u5927\u5927\u7b80\u5316\u540e\u7eed\u7684\u8f6c\u6362\uff0c\u5904\u7406\u64cd\u4f5c\u3002\u5177\u4f53\u7684\u4ece Iterator \u5230 Stream\u00a0\u7684\u8f6c\u6362\u65b9\u5f0f\u6709\u4e24\u79cd"},{"title":"Java 8 Map \u4e2d\u65b0\u589e\u7684\u65b9\u6cd5\u4f7f\u7528\u8bb0\u5f55","link":"https:\/\/yanbin.blog\/java-8-map-new-added-methods\/","pubDate":"Wed, 31 Oct 2018 00:13:29 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-map-new-added-methods\/","description":"\n<p>\u5f97\u76ca\u4e8e Java 8\u00a0\u7684 default\u00a0\u65b9\u6cd5\u7279\u6027\uff0cJava 8\u00a0\u5bf9 Map\u00a0\u589e\u52a0\u4e86\u4e0d\u5c11\u5b9e\u7528\u7684\u9ed8\u8ba4\u65b9\u6cd5\uff0c\u50cf <code>getOrDefault<\/code>, <code>forEach<\/code>, <code>replace<\/code>, <code>replaceAll<\/code>, <code>putIfAbsent<\/code>, <code>remove(key, value)<\/code>, <code>computeIfPresent<\/code>, <code>computeIfAbsent<\/code>, <code>compute<\/code>\u00a0\u548c<code>merge<\/code>\u00a0\u65b9\u6cd5\u3002\u53e6\u5916\u4e0e Map\u00a0\u76f8\u5173\u7684 <code>Map.Entry<\/code>\u00a0\u4e5f\u65b0\u52a0\u4e86\u591a\u4e2a\u7248\u672c\u7684 <code>comparingByKey<\/code>\u00a0\u548c <code>comparingByValue<\/code>\u00a0\u65b9\u6cd5\u3002<\/p>\n<p>\u4e3a\u8fbe\u5230\u719f\u7ec3\u8fd0\u7528\u4e0a\u8ff0\u9664 <code>getOrDefault<\/code>\u00a0\u548c <code>forEach<\/code>\u00a0\u5916\u7684\u5176\u4ed6\u65b9\u6cd5\uff0c\u6709\u5fc5\u8981\u9010\u4e00\u4f53\u9a8c\u4e00\u756a\uff0c\u5982\u4f55\u8c03\u7528\uff0c\u8fd4\u56de\u503c\u4ee5\u53ca\u8c03\u7528\u540e\u7684\u6548\u679c\u5982\u4f55\u3002\u770b\u770b\u6bcf\u4e2a\u65b9\u6cd5\u4e0d\u81f3\u4e8e Java 8\u00a0\u90a3\u4e48\u591a\u5e74\u8fd8\u603b\u662f \u00a0<code>if(map.containsKey(key))...<\/code>\u00a0\u90a3\u6837\u7684\u8001\u5957\u64cd\u4f5c\u3002<\/p>\n<p>\u524d\u6ce8\uff1aMap\u00a0\u65b0\u589e\u65b9\u6cd5\u5bf9\u00a0 present\u00a0\u7684\u5224\u65ad\u662f map.containsKey(key) &amp;&amp; map.get(key) != null\uff0c\u7b80\u5355\u5c31\u662f\u00a0 map.get(key) != null\uff0c\u4e5f\u5c31\u662f\u5373\u4f7f key\u00a0\u5b58\u5728\uff0c\u4f46\u5bf9\u5e94\u7684\u503c\u4e3a null\u00a0\u7684\u8bdd\u4e5f\u89c6\u4e3a absent\u3002absent\u00a0\u5c31\u662f map.get(key) == null\u3002<\/p>\n<p>\u4e0d\u540c Map\u00a0\u5b9e\u73b0\u5bf9 key\/value\u00a0\u662f\u5426\u80fd\u4e3a null\u00a0\u6709\u4e0d\u540c\u7684\u7ea6\u675f, HashMap, LinkedHashMap, key\u00a0\u548c value\u00a0\u90fd\u53ef\u4ee5\u4e3a null\u00a0\u503c\uff0cTreeMap\u00a0\u7684 key\u00a0\u4e3a\u4e0d\u80fd\u4e3a null,\u00a0\u4f46 value \u53ef\u4ee5\u4e3a null,\u00a0\u800c Hashtable, ConcurrentMap\u00a0\u5219 key\u00a0\u548c\u00a0value\u00a0\u90fd\u4e0d\u540c\u4e3a null\u3002\u4e00\u53e5\u8bdd absent\/present\u00a0\u7684\u5224\u65ad\u662f map.get(key)\u00a0\u662f\u5426\u4e3a null\u3002<\/p>\n<p>\u65b9\u6cd5\u4ecb\u7ecd\u7684\u987a\u5e8f\u662f\u5b83\u4eec\u76f8\u5bf9\u4e8e\u672c\u4eba\u7684\u751f\u758f\u7a0b\u5ea6\u800c\u5b9a\u7684\u3002\u6bcf\u4e2a\u65b9\u6cd5\u4ecb\u7ecd\u4e3b\u8981\u5206\u4e24\u90e8\u5206\uff0c\u53c2\u8003\u5b9e\u73b0\u4ee3\u7801\u4e0e\u793a\u4f8b\u4ee3\u7801\u6267\u884c\u6548\u679c\u3002\u53c2\u8003\u5b9e\u73b0\u4ee3\u7801\u6458\u81ea JDK\u00a0\u5b98\u65b9\u7684 <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/Map.html\">Map JavaDoc<\/a>\u3002<\/p>\n<h3>getOrDefault\u00a0\u65b9\u6cd5<\/h3>\n<p>\u672c\u60f3\u5ffd\u7565\u8fd9\u4e2a\u65b9\u6cd5\u7684\u6d4b\u8bd5\uff0c\u56e0\u4e3a\u6d89\u53ca\u5230\u00a0key\u00a0\u5b58\u5728\uff0c\u503c\u4e3a null\u00a0\u7684\u60c5\u51b5\u3002\u5f53 key\u00a0\u4e0d\u5b58\u5728\u6216\u76f8\u5173\u8054\u7684\u503c\u4e3a null\u00a0\u65f6\uff0c\u8fd4\u56de\u9ed8\u8ba4\u503c\uff0c\u5426\u5219\u8fd4\u56de\u5b9e\u9645\u503c\u3002\u4e0d\u8981\u8ba4\u4e3a key\u00a0\u5b58\u5728\u65f6\u603b\u662f\u8fd4\u56de map.get(key)\u00a0\u7684\u503c\u3002<\/p>\n<h4>\u53c2\u8003\u5b9e\u73b0\uff1a<\/h4>"},{"title":"\u5982\u4f55\u5feb\u4e50\u7684\u4f7f\u7528 Java 8 \u7684 Lambda","link":"https:\/\/yanbin.blog\/happy-with-java8-lambda\/","pubDate":"Wed, 08 Aug 2018 23:45:05 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/happy-with-java8-lambda\/","description":"\n<p>Java 8\u00a0\u7684 Lambda\u00a0\u7279\u6027\u8f83\u4e4b\u4e8e\u5148\u524d\u7684\u6cdb\u578b\u52a0\u5165\u66f4\u80fd\u9f13\u821e\u4eba\u5fc3\u7684\uff0c\u6211\u5bf9 Lambda\u00a0\u7684\u7406\u89e3\u662f\u5b83\u5f97\u4ee5\u8ba9 Java\u00a0\u4ee5\u51fd\u6570\u5f0f\u601d\u7ef4\u7684\u65b9\u5f0f\u6765\u5199\u4ee3\u7801\u3002\u800c\u5199\u51fa\u7684\u4ee3\u7801\u662f\u5426\u662f\u51fd\u6570\u5f0f\uff0c\u5e76\u4e0d\u5355\u7eaf\u5728\u5305\u542b\u4e86\u591a\u5c11\u00a0Lambda\u00a0\u8868\u8fbe\u5f0f\uff0c\u800c\u5728\u601d\u7ef4\uff0c\u8981\u795e\u4f3c\u3002<\/p>\n<p>\u5b9e\u9645\u4e2d\u770b\u8fc7\u4e00\u4e9b\u4ee3\u7801\uff0c\u4e3a\u4e86\u00a0Lambda\u00a0\u8868\u8fbe\u5f0f\u800c\u00a0Lambda(\u51fd\u6570\u5f0f)\uff0c\u6709\u4e00\u79cd\u5c11\u5e74\u4e0d\u8bc6\u6101\u6ecb\u5473\uff0c\u4e3a\u8d4b\u65b0\u8bcd\u5f3a\u8bf4\u6101\u7684\u5473\u9053\u3002\u4ece\u800c\u81f4\u4f7f\u539f\u672c\u4e00\u4e2a\u7b80\u5355\u7684\u65b9\u8c03\u7528\u786c\u751f\u751f\u7684\u8981\u663e\u5f0f\u7684\u7528\u7c7b\u5982 <code>apply()<\/code>, <code>accept(obj)<\/code>\u00a0\u7b49\u5f62\u5f0f\u3002\u4e0d\u4ec5\u9020\u6210\u4ee3\u7801\u53ef\u8bfb\u6027\u5dee\uff0c\u4e14\u53ef\u6d4b\u8bd5\u6027\u4e5f\u53d8\u574f\u4e86\u3002<\/p>\n<p>\u4e3a\u4ec0\u4e48\u8bf4\u7684\u662f\u5feb\u4e50\u7684\u4f7f\u7528 Java 8\u00a0\u7684 Lambda\u00a0\u5462\uff1f\u6211\u7a83\u4ee5\u4e3a\u7b2c\u4e00\u4e2a\u5ff5\u5934\u58f0\u660e Lambda\u00a0\u8868\u8fbe\u5f0f\u4e3a\u5b9e\u4f8b\/\u7c7b\u53d8\u91cf(\u50cf\u672c\u6587\u7b2c\u4e00\u6bb5\u4ee3\u7801\u90a3\u6837)\uff0c\u800c\u4e0d\u662f\u65b9\u6cd5\u7684\uff0c\u4e00\u5b9a\u4f1a\u89c9\u5f97\u5982\u6b64\u4f7f\u7528\u65b9\u5f0f\u5f88\u5feb\u4e50\u7684\u3002\u6240\u8c13\u72ec\u4e50\u4e50\uff0c\u4e0d\u5982\u4f17\u4e50\u4e50\uff1b\u72ec\u4e50\u4e50\uff0c\u4f17\u4e0d\u4e50\u5b9a\u7136\u662f\u66f4\u5927\u7684\u5feb\u4e50;\u00a0\u66f4\u6781\u81f4\u4e00\u4e9b\uff0c\u4e0d\u7ba1\u4ec0\u4e48\u65f6\u5019\u5fc5\u987b\u662f\uff1a\u6211\u5feb\u4e50\uff0c\u6240\u4ee5\u4f60\u4e5f\u5feb\u4e50\u3002<\/p>\n<p>\u4e00\u65b9\u9762\u4e5f\u5728\u4e8e\u00a0Java\u00a0\u8fd8\u6ca1\u6709\u8fdb\u5316\u5230 JavaScript\u00a0\u6216\u00a0 Scala\u00a0\u90a3\u6837\u7684\u6c34\u5e73\uff0cJavaScript\u00a0\u7684\u51fd\u6570\u7c7b\u578b\u53d8\u91cf\uff0c\u4e0d\u4e00\u5b9a\u8981\u7528 <code>apply<\/code>\u00a0\u6216 <code>call<\/code>,\u00a0\u76f4\u63a5\u62ec\u53f7\u5c31\u80fd\u5b9e\u73b0\u65b9\u6cd5\u8c03\u7528\u3002Scala\u00a0\u7684\u51fd\u6570\u7c7b\u578b\u7528\u62ec\u53f7\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u5339\u914d\u5230 <code>apply<\/code>\u00a0\u6216 <code>update<\/code>\u00a0\u7b49\u65b9\u6cd5\u4e0a\u53bb\u3002"},{"title":"Java8 Optional \u51e0\u4e2a\u5e38\u89c1\u9519\u8bef\u7528\u6cd5","link":"https:\/\/yanbin.blog\/java8-optional-several-common-incorrect-usages\/","pubDate":"Sun, 22 Jul 2018 23:23:45 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java8-optional-several-common-incorrect-usages\/","description":"\n<p>Java 8\u00a0\u5f15\u5165\u7684 Optional\u00a0\u7c7b\u578b\uff0c\u57fa\u672c\u662f\u628a\u5b83\u5f53\u4f5c null\u00a0\u503c\u4f18\u96c5\u7684\u5904\u7406\u65b9\u5f0f\u3002\u5176\u5b9e\u4e5f\u4e0d\u5b8c\u5168\u5982\u6b64\uff0cOptional\u00a0\u5728\u8bed\u4e49\u4e0a\u66f4\u80fd\u4f53\u73b0\u6709\u8fd8\u662f\u6ca1\u6709\u503c\u3002\u6240\u4ee5\u5b83\u4e0d\u662f\u8bbe\u8ba1\u6765\u4f5c\u4e3a null\u00a0\u7684\u66ff\u4ee3\u54c1\uff0c\u5982\u679c\u65b9\u6cd5\u8fd4\u56de null\u00a0\u503c\u8868\u8fbe\u4e86\u4e8c\u4e49\u6027\uff0c\u6ca1\u6709\u7ed3\u679c\u6216\u662f\u6267\u884c\u4e2d\u51fa\u73b0\u5f02\u5e38\u3002<\/p>\n<p>\u5728 Oracle\u00a0 \u505a\u00a0 Java\u00a0\u8bed\u8a00\u5de5\u4f5c\u7684\u00a0 Brian\u00a0Goetz\u00a0\u5728 Stack Overflow\u00a0\u56de\u590d\u00a0 <a href=\"https:\/\/stackoverflow.com\/questions\/26327957\/should-java-8-getters-return-optional-type\/26328555#26328555\">Should Java 8 getters return optional type?<\/a>\u00a0\u4e2d\u8bb2\u8ff0\u4e86\u5f15\u5165\u00a0 Optional\u00a0\u7684\u4e3b\u8981\u52a8\u673a\u3002<\/p>\n<blockquote>\nOur intention was to provide a limited mechanism for library method return types where there needed to be a clear way to represent \u201cno result\u201d, and using null for such was overwhelmingly likely to cause errors.\n<\/blockquote>\n<p>\u8bf4\u7684\u662f\u00a0 Optional\u00a0\u63d0\u4f9b\u4e86\u4e00\u4e2a\u6709\u9650\u7684\u673a\u5236\u8ba9\u7c7b\u5e93\u65b9\u6cd5\u8fd4\u56de\u503c\u6e05\u6670\u7684\u8868\u8fbe\u6709\u4e0e\u6ca1\u6709\u503c\uff0c\u907f\u514d\u5f88\u591a\u65f6\u5019 null\u00a0\u9020\u6210\u7684\u9519\u8bef\u3002\u5e76\u975e\u6709\u4e86\u00a0 Optional\u00a0\u5c31\u8981\u5b8c\u5168\u675c\u7edd NullPointerException\u3002<\/p>\n<p>\u5728\u00a0Java 8\u00a0\u4e4b\u524d\u4e00\u4e2a\u5b9e\u8df5\u662f\u65b9\u6cd5\u8fd4\u56de\u96c6\u5408\u6216\u6570\u7ec4\u65f6\uff0c\u5e94\u8fd4\u56de\u7a7a\u96c6\u5408\u6216\u6570\u7ec4\u8868\u793a\u6ca1\u6709\u5143\u7d20;\u00a0\u800c\u5bf9\u4e8e\u8fd4\u56de\u5bf9\u8c61\uff0c\u53ea\u80fd\u7528\u00a0null\u00a0\u6765\u8868\u793a\u4e0d\u5b58\u5728\uff0c\u73b0\u5728\u53ef\u4ee5\u7528\u00a0 Optional\u00a0\u6765\u8868\u793a\u8fd9\u4e2a\u610f\u4e49\u3002<\/p>\n<p>\u81ea Java8\u00a0\u4e8e\u00a0 2014-03-18\u00a0\u53d1\u5e03\u540e\u5df2 5\u00a0\u5e74\u6709\u4f59\uff0c\u8fd9\u91cc\u5c31\u5217\u4e3e\u51e0\u4e2a\u6211\u4eec\u5728\u9879\u76ee\u5b9e\u8df5\u4e2d\u4f7f\u7528\u00a0Optional\u00a0\u5e38\u89c1\u7684\u51e0\u4e2a\u7528\u6cd5\u3002<\/p>\n<h3>Optional\u00a0\u7c7b\u578b\u4f5c\u4e3a\u5b57\u6bb5\u6216\u65b9\u6cd5\u53c2\u6570<\/h3>\n<p>\u8fd9\u513f\u628a Optional\u00a0 \u7c7b\u578b\u7528\u4e3a\u5b57\u6bb5(\u7c7b\u6216\u5b9e\u4f8b\u53d8\u91cf)\u548c\u65b9\u6cd5\u53c2\u6570\u653e\u5728\u4e00\u8d77\u6765\u8bb2\uff0c\u662f\u56e0\u4e3a\u5047\u5982\u6211\u4eec\u4f7f\u7528 IntelliJ IDEA\u00a0\u6765\u5199\u00a0Java 8\u00a0\u4ee3\u7801\uff0cIDEA\u00a0\u5bf9\u4e8e\u00a0 Optional\u00a0\u4f5c\u4e3a\u5b57\u6bb5\u548c\u65b9\u6cd5\u53c2\u6570\u4f1a\u7ed9\u51fa\u540c\u6837\u7684\u4ee3\u7801\u5efa\u8bae\uff1a"},{"title":"Java 8 \u6839\u636e\u5c5e\u6027\u503c\u5bf9\u5217\u8868\u53bb\u91cd","link":"https:\/\/yanbin.blog\/java-8-list-deduplication-with-lambda\/","pubDate":"Tue, 06 Feb 2018 21:39:55 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-list-deduplication-with-lambda\/","description":"\n<p>\u5bf9\u5217\u8868\u7684\u53bb\u91cd\u5904\u7406\uff0cJava 8\u00a0\u5728 <code>Stream<\/code>\u00a0\u63a5\u53e3\u4e0a\u63d0\u4f9b\u4e86\u7c7b\u4f3c\u4e8e SQL\u00a0\u8bed\u53e5\u90a3\u6837\u7684 <code>distinct()<\/code>\u00a0\u65b9\u6cd5\uff0c\u4e0d\u8fc7\u5b83\u4e5f\u53ea\u80fd\u57fa\u4e8e\u5bf9\u8c61\u6574\u4f53\u6bd4\u8f83\u6765\u53bb\u91cd\uff0c\u5373\u901a\u8fc7 equals\/hashCode\u00a0\u65b9\u6cd5\u3002<code>distinct<\/code>\u00a0\u65b9\u6cd5\u7684\u529f\u6548\u4e0e\u4ee5\u5f80\u7684 <code>new ArrayList(new HashSet(books))<\/code>\u00a0\u5dee\u4e0d\u591a\u3002\u7528\u8d77\u6765\u662f<\/p>\n<blockquote><br\/>\n<p>List&lt;Book&gt; unique = book.stream().distinct().collect(Collectors.toList())<\/p>\n<\/blockquote>\n<p>\u5e76\u4e14\u8fd9\u79cd\u53bb\u91cd\u65b9\u5f0f\u9700\u8981\u5728\u6a21\u578b\u7c7b\u4e2d\u540c\u65f6\u5b9e\u73b0 equals\u00a0\u548c hashCode\u00a0\u65b9\u6cd5\u3002<\/p>\n<p>\u56de\u5230\u5b9e\u9645\u9879\u76ee\u4e2d\u6765\uff0c\u6211\u4eec\u5f88\u591a\u65f6\u5019\u7684\u9700\u6c42\u662f\u8981\u6839\u636e\u5bf9\u8c61\u7684\u67d0\u4e2a\u5c5e\u6027\u6765\u53bb\u91cd\u3002\u6bd4\u5982\u63a5\u4e0b\u6765\u7684\u4e00\u4e2a\u5b9e\u4f8b\uff0c\u4e00\u4e2a books \u5217\u8868\u4e2d\u5b58\u5728 ID\u00a0\u4e00\u6837\uff0cname \u5374\u4e0d\u540c\u7684 book,\u00a0\u6211\u4eec\u8ba4\u4e3a\u8fd9\u662f\u91cd\u590d\u7684\uff0c\u6240\u4ee5\u9700\u8981\u6839\u636e book\u00a0\u7684 id\u00a0\u5c5e\u6027\u5bf9\u884c\u53bb\u91cd\u3002\u5728 collect\u00a0\u7684\u65f6\u5019\u7528\u5230\u7684\u65b9\u6cd5\u662f <code>collectinAndThen(...)<\/code>,\u00a0\u4e0b\u9762\u662f\u7b80\u5355\u4ee3\u7801:"},{"title":"JdbcTemplate \u6613\u88ab Java 8 Lambda \u5e26\u5165\u7684\u5751","link":"https:\/\/yanbin.blog\/jdbctemplate-java-8-lambda-trick\/","pubDate":"Sun, 26 Feb 2017 03:06:18 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdbctemplate-java-8-lambda-trick\/","description":"\n<p>Spring \u7684 JdbcTemplate \u4e3a\u6211\u4eec\u64cd\u4f5c\u6570\u636e\u5e93\u63d0\u4f9b\u975e\u5e38\u5927\u7684\u4fbf\u5229\uff0c\u4e0d\u9700\u8981\u663e\u5f0f\u7684\u7ba1\u7406\u8d44\u6e90\u548c\u5904\u7406\u5f02\u5e38\u3002\u5728\u6211\u4eec\u8fdb\u5165\u5230\u4e86 Java 8 \u540e\uff0cJdbcTemplate \u65b9\u6cd5\u4e2d\u7684\u56de\u8c03\u51fd\u6570\u53ef\u4ee5\u7528 Lambda \u8868\u8fbe\u5f0f\u8fdb\u884c\u7b80\u5316\uff0c\u800c\u672c\u6587\u8981\u8bf4\u7684\u6b63\u662f\u8fd9\u79cd Lambda \u7b80\u5316\u5bb9\u6613\u7ed9\u6211\u4eec\u5e26\u6765\u7684\u4e00\u4e2a Bug, \u8fd9\u662f\u6211\u5728\u4e00\u4e2a\u5b9e\u9645\u9879\u76ee\u4e2d\u5199\u7684\u5355\u5143\u6d4b\u8bd5\u53d1\u73b0\u7684\u3002<\/p>\n\u4e0b\u9762\u5c31\u662f\u6211\u4eec\u7684\u4e00\u4e2a\u6837\u677f\u4ee3\u7801\uff0c\u5728\u6211\u4eec\u7684 <code>UserRespository<\/code> \u4e2d\u6709\u4e00\u4e2a\u65b9\u6cd5 findAll() \u7528\u4e8e\u83b7\u5f97\u6240\u6709\u7528\u6237\uff1a<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">User<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"nf\">findAll<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">User<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">users<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;&gt;<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">jdbcTemplate<\/span><span class=\"p\">.<\/span><span class=\"na\">query<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;select id, name from user&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">rs<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">while<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">rs<\/span><span class=\"p\">.<\/span><span class=\"na\">next<\/span><span class=\"p\">())<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">users<\/span><span class=\"p\">.<\/span><span class=\"na\">add<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">User<\/span><span class=\"p\">(<\/span><span class=\"n\">rs<\/span><span class=\"p\">.<\/span><span class=\"na\">getInt<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;id&#34;<\/span><span class=\"p\">),<\/span><span class=\"w\"> <\/span><span class=\"n\">rs<\/span><span class=\"p\">.<\/span><span class=\"na\">getString<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;name&#34;<\/span><span class=\"p\">)));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">});<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">8<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">users<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">9<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"},{"title":"Java8 Lambda \u8868\u8fbe\u5f0f\u4e0e Checked Exception","link":"https:\/\/yanbin.blog\/java8-lambda-and-checked-exception\/","pubDate":"Wed, 08 Feb 2017 23:54:38 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java8-lambda-and-checked-exception\/","description":"\n\u5f53\u6211\u4eec\u5728\u4f7f\u7528 Java 8 \u7684 Lambda \u8868\u8fbe\u5f0f\u65f6\uff0c\u8868\u8fbe\u5f0f\u5185\u5bb9\u9700\u8981\u629b\u51fa\u5f02\u5e38\uff0c\u4e5f\u8bb8\u8fd8\u4f1a\u60f3\u5f53\u7136\u7684\u8ba9\u5f53\u524d\u65b9\u6cd5\u518d\u5f80\u5916\u629b\u6765\u89e3\u51b3\u7f16\u8bd1\u95ee\u9898\uff0c\u5982\u4e0b\u9762\u7684\u4ee3\u7801\n<br\/>\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2017\/java8-lambda-and-checked-exception\/java-lambda-exception-1.png\"\nwidth=\"383px\"\n\/>\n\u8ba9 <code>main()<\/code>\u00a0\u65b9\u6cd5\u629b\u51fa <code>Exception<\/code>\u00a0\u8fd8\u662f\u4e0d\u89e3\u51b3\u51b3\u7f16\u8bd1\u9519\u8bef\uff0c\u4ecd\u7136\u63d0\u793a \"Unhandled exception: java.io.FileNotFoundException\"\u3002<br\/><br\/>\n\u56e0\u4e3a\u6211\u4eec\u53ef\u80fd\u4fdd\u6301\u7740\u60ef\u6027\u601d\u7ef4\uff0c\u5ffd\u7565\u4e86 Lambda \u672c\u8eab\u5c31\u662f\u4e00\u4e2a\u529f\u80fd\u6027\u63a5\u53e3\u65b9\u6cd5\u7684\u5b9e\u73b0\uff0c\u6240\u4ee5\u628a\u4e0a\u9762\u7684\u4ee3\u7801\u8fd8\u539f\u4e3a\u533f\u540d\u7c7b\u7684\u65b9\u5f0f<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">foo<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Stream<\/span><span class=\"p\">.<\/span><span class=\"na\">of<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;a&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;b&#34;<\/span><span class=\"p\">).<\/span><span class=\"na\">forEach<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">Consumer<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"nd\">@Override<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">accept<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"w\"> <\/span><span class=\"n\">s<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">FileInputStream<\/span><span class=\"p\">(<\/span><span class=\"n\">s<\/span><span class=\"p\">).<\/span><span class=\"na\">close<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"><span class=\"p\">});<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u90a3\u4e48\u5bf9\u4e8e\u4e0a\u9762\u90a3\u79cd\u60c5\u51b5\u5e94\u8be5\u5982\u4f55\u5904\u7406\u5462\uff1f"},{"title":"Java 8 \u53ef\u91cd\u590d\u6ce8\u89e3\u7684\u7406\u89e3\u4e0e\u5e94\u7528","link":"https:\/\/yanbin.blog\/java8-repeatable-annotations\/","pubDate":"Mon, 16 Jan 2017 23:08:46 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java8-repeatable-annotations\/","description":"\n<h2>Java 8 \u4e4b\u524d\u5982\u4f55\u91cd\u590d\u4f7f\u7528\u6ce8\u89e3<\/h2>\n\u5728 Java 8 \u4e4b\u524d\u6211\u4eec\u4e0d\u80fd\u5728\u4e00\u4e2a\u7c7b\u578b\u91cd\u590d\u4f7f\u7528\u540c\u4e00\u4e2a\u6ce8\u89e3\uff0c\u4f8b\u5982 Spring \u7684\u6ce8\u89e3 <code>@PropertySource<\/code>\u00a0\u4e0d\u80fd\u4e0b\u9762\u90a3\u6837\u6765\u5f15\u5165\u591a\u4e2a\u5c5e\u6027\u6587\u4ef6<\/p>\n<blockquote>\n@PropertySource(\"classpath:config.properties\")<br \/>\n@PropertySource(\"file:application.properties\")<br \/>\npublic class MainApp {}\n<\/blockquote>\n\u4e0a\u9762\u7684\u4ee3\u7801\u65e0\u6cd5\u5728 Java 7 \u4e0b\u901a\u8fc7\u7f16\u8bd1\uff0c\u9519\u8bef\u662f: <span style=\"color: #800000;\">Duplicate annotation<\/span><br\/><br\/>\n\u4e8e\u662f\u6211\u4eec\u5728 Java 8 \u4e4b\u524d\u60f3\u5230\u4e86\u4e00\u4e2a\u65b9\u6848\u6765\u89c4\u907f Duplicate Annotation \u7684\u9519\u8bef: \u5373\u58f0\u660e\u4e00\u4e2a\u65b0\u7684 Annotation \u6765\u5305\u88f9 <code>@PropertySource<\/code>, \u5982 <code>@PropertySources<\/code><br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"nd\">@Retention<\/span><span class=\"p\">(<\/span><span class=\"n\">RetentionPolicy<\/span><span class=\"p\">.<\/span><span class=\"na\">RUNTIME<\/span><span class=\"p\">)<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"nd\">@interface<\/span><span class=\"w\"> <\/span><span class=\"n\">PropertySources<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">PropertySource<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"nf\">value<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u7136\u540e\u4f7f\u7528\u65f6\u4e24\u4e2a\u6ce8\u89e3\u9f50\u4e0a\u9635"},{"title":"CompletableFuture \u7684\u5e76\u53d1\u6027\u80fd\u7814\u7a76","link":"https:\/\/yanbin.blog\/completablefuture-concurrent-performance\/","pubDate":"Thu, 29 Dec 2016 02:36:21 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/completablefuture-concurrent-performance\/","description":"\n\u4eca\u5929\u7ee7\u7eed\u63a2\u8ba8 <code>CompletableFuture<\/code> \u7684\u7279\u6027\uff0c\u5b83\u5e76\u53d1\u65f6\u7684\u6027\u80fd\u5982\u4f55\u5462\uff1f\u6211\u4eec\u77e5\u9053\u96c6\u5408\u7684 <code>stream()<\/code> \u540e\u7684\u64cd\u4f5c\u662f\u5e8f\u5217\u5316\u8fdb\u884c\u7684\uff0c<code>parallelStream()<\/code>\u662f\u80fd\u591f\u5e76\u53d1\u6267\u884c\u7684\uff0c\u800c\u7528 <code>CompletableFuture<\/code> \u53ef\u4ee5\u66f4\u7075\u6d3b\u7684\u63a7\u5236\u5e76\u53d1\u3002<\/p>\n<br\/>\n\u6211\u4eec\u5148\u53ef\u4ee5\u5bf9\u6bd4\u4e00\u4e0b parallelStream() \u4e0e CompletableFuture \u7684\u6027\u80fd\u5dee\u5f02<br\/><br\/>\n\u5047\u8bbe\u4e00\u4e2a\u8fd9\u6837\u7684\u8017\u65f6 1000 \u6beb\u79d2\u7684\u8ba1\u7b97\u4efb\u52a1<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"kd\">private<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">int<\/span><span class=\"w\"> <\/span><span class=\"nf\">getJob<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">try<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Thread<\/span><span class=\"p\">.<\/span><span class=\"na\">sleep<\/span><span class=\"p\">(<\/span><span class=\"n\">1000<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"k\">catch<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">InterruptedException<\/span><span class=\"w\"> <\/span><span class=\"n\">e<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">50<\/span><span class=\"p\">;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">7<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5206\u522b\u7528\u4e0b\u9762\u4e24\u4e2a\u65b9\u6cd5\u6765\u6d4b\u8bd5\uff0c\u4efb\u52a1\u6570\u53ef\u4ee5\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236"},{"title":"\u7406\u89e3 CompletableFuture \u7684\u4efb\u52a1\u4e0e\u56de\u8c03\u51fd\u6570\u7684\u7ebf\u7a0b","link":"https:\/\/yanbin.blog\/understand-completablefuture-task-callback-threads\/","pubDate":"Fri, 23 Dec 2016 02:21:27 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/understand-completablefuture-task-callback-threads\/","description":"\n\u7ee7\u7eed\u5bf9 <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/concurrent\/CompletableFuture.html\">CompletableFuture<\/a> \u7684\u5b66\u4e60\uff0c\u672c\u7136\u4f9d\u7136\u4e0d\u5bf9\u5b83\u7684\u4f17\u591a\u65b9\u6cd5\u7684\u4ecb\u7ecd\uff0c\u5176\u5b9e\u4e5f\u4e0d\u5bb9\u6613\u901a\u8fc7\u4e00\u7bc7\u8ff0\u8bf4\u5b8c\u6240\u6709 CompletableFuture \u7684\u64cd\u4f5c\u3002\u6b64\u5904\u91cd\u70b9\u4e86\u89e3\u4e0b CompletableFuture \u51e0\u7c7b\u64cd\u4f5c\u65f6\u6240\u4f7f\u7528\u7684\u7ebf\u7a0b\uff0cCompletableFuture \u7684\u65b9\u6cd5\u91cd\u70b9\u5728\u5b83\u7684\u9759\u6001\u65b9\u6cd5\u4ee5\u53ca\u5b9e\u73b0\u81ea <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/concurrent\/CompletionStage.html\">CompletionStage<\/a> \u63a5\u53e3\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u662f\u610f\u56fe\u5f02\u6b65\u5316\u7f16\u7a0b\uff0c\u53cd\u800c\u81ea\u6211\u6807\u699c\u7684 <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/concurrent\/Future.html\">Future<\/a> \u4e2d\u7684\u65b9\u6cd5\u7528\u7684\u5c11\u4e86\u3002<\/p>\n<br\/>\nCompletableFuture \u6839\u636e\u4efb\u52a1\u7684\u4e3b\u4ece\u5173\u7cfb\u4e3a<br\/>\n<ol>\n<li>\u63d0\u4ea4\u4efb\u52a1\u7684\u65b9\u6cd5\uff0c\u5982\u9759\u6001\u65b9\u6cd5 supplyAsync(supplier[, executor]),\u00a0 runAsync(runnable[, executor])<\/li>\n<li>\u56de\u8c03\u51fd\u6570\uff0c\u5373\u5bf9\u4efb\u52a1\u6267\u884c\u540e\u6240\u4f5c\u51fa\u56de\u5e94\u7684\u65b9\u6cd5\uff0c\u591a\u6570\u65b9\u6cd5\u4e86\uff0c\u5982 thenRun(action), thenRunAsync(action[, executor]), whenComplete(action), whenCompleteAsync(action[, executor]) \u7b49<\/li>\n<\/ol>\n<br\/>\n\u6839\u636e\u6267\u884c\u65b9\u6cd5\u53ef\u5206\u4e3a\u540c\u6b65\u4e0e\u5f02\u6b65\u65b9\u6cd5\uff0c\u4efb\u52a1\u90fd\u662f\u8981\u88ab\u5f02\u6b65\u6267\u884c\uff0c\u6240\u4ee5\u63d0\u4ea4\u4efb\u52a1\u7684\u65b9\u6cd5\u90fd\u662f\u5f02\u6b65\u7684\u3002\u800c\u5bf9\u4efb\u52a1\u4f5c\u51fa\u56de\u5e94\u7684\u65b9\u6cd5\u5f88\u591a\u5206\u4e3a\u4e24\u4e2a\u7248\u672c\uff0c\u5982<br\/>\n<ol>\n<li>\u540c\u6b65\u65b9\u6cd5\uff0c\u5982 thenRun(action), whenComplete(action)<\/li>\n<li>\u5f02\u6b65\u65b9\u6cd5\uff0c\u5982 thenRunAsync(action[, executor]), whenCompleteAsync(action[, executor]), \u5f02\u6b65\u65b9\u6cd5\u53ef\u4ee5\u4f20\u5165\u7ebf\u7a0b\u6c60\uff0c\u5426\u5219\u7528\u9ed8\u8ba4\u7684<\/li>\n<\/ol>\n<br\/>\n\u56e0\u6b64\u6240\u8981\u7406\u89e3\u7684 CompletableFuture \u7684\u7ebf\u7a0b\u4f1a\u6d89\u53ca\u5230\u4efb\u52a1\u4e0e\u56de\u8c03\u51fd\u6570\u6240\u4f7f\u7528\u7684\u7ebf\u7a0b\u3002"},{"title":"Java 8 CompletableFuture \u6d45\u5165","link":"https:\/\/yanbin.blog\/java-8-completablefuture-brief-touch\/","pubDate":"Fri, 23 Dec 2016 01:50:09 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-completablefuture-brief-touch\/","description":"\nJava 1.5 \u6709\u4e86 <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/concurrent\/Future.html\">Future<\/a>, \u53ef\u8c13\u662f\u8de8\u4e86\u4e00\u5927\u6b65\uff0c\u7ee7\u800c Java 1.8 \u65b0\u52a0\u5165\u4e00\u4e2a Future \u7684\u5b9e\u73b0<a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/util\/concurrent\/CompletableFuture.html\"> CompletableFuture<\/a>, \u4ece\u6b64\u7ebf\u7a0b\u4e0e\u7ebf\u7a0b\u4e4b\u95f4\u53ef\u4ee5\u6109\u5feb\u7684\u5bf9\u8bdd\u4e86\u3002\u6700\u521d\u4e24\u4e2a\u7ebf\u7a0b\u95f4\u7684\u534f\u8c03\u6211\u91c7\u7528\u8fc7 Object \u7684 \u00a0<code>wait()<\/code>\u00a0\u548c <code>notify()<\/code>\u00a0, Thread \u7684 <code>join()<\/code> \u65b9\u6cd5\uff0c\u90a3\u53ef\u7b97\u662f\u5f88\u4f4e\u7ea7\u7684 API \u4e86\uff0c\u662f\u5426\u5f88\u591a Java \u7a0b\u5e8f\u90fd\u4e0d\u77e5\u9053\u5b83\u4eec\u7684\u5b58\u5728\uff0c\u6216\u6839\u672c\u6ca1\u7528\u8fc7\u5b83\u4eec\u3002<\/p>\n<br\/>\n\u5982\u679c\u662f\u7b80\u5355\u7684\u7b49\u5f85\u6240\u6709\u7ebf\u7a0b\u5b8c\u6210\u53ef\u4f7f\u7528 Java 1.5 \u7684 <a href=\"https:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/concurrent\/CountDownLatch.html\">CountDownLatch<\/a>, \u8fd9\u91cc\u6709\u4e00\u7bc7\u4ecb\u7ecd <a href=\"http:\/\/unmi.cc\/countdownlatch-threads\/\">CountDownLatch \u534f\u8c03\u7ebf\u7a0b<\/a>, \u5c31\u662f\u5b9e\u73b0\u7684 waitAll(threads) \u529f\u80fd\u3002\u800c Java 8 \u7684 <code>CompletableFuture<\/code>\u00a0\u7684\u529f\u80fd\u5c31\u591a\u53bb\uff0c\u53ef\u7b80\u5355\u4f7f\u7528\u5b83\u5b9e\u73b0\u5f02\u6b65\u65b9\u6cd5\u3002\u867d\u8bf4 <code>CompletableFuture<\/code>\u00a0\u5b9e\u73b0\u4e86 <code>Future<\/code>\u00a0\u63a5\u53e3\uff0c\u4f46\u5b83\u591a\u6570\u65b9\u6cd5\u6e90\u81ea\u4e8e <code>CompletionStage<\/code>, \u6240\u4ee5\u8fd8\u91cc\u6c0f\u4ee3\u6362\uff0c\u7528 <code>Future<\/code>\u00a0\u6765\u5f15\u7528 <code>CompletableFuture<\/code>\u00a0\u5b9e\u4f8b\u5c31\u5f88\u7275\u5f3a\u4e86; \u8fd9\u4e5f\u662f\u4e3a\u4ec0\u4e48 PlayFramework \u81ea 2.5 \u5f00\u59cb\u76f4\u63a5\u66b4\u9732\u7684\u7c7b\u578b\u662f <code>CompletionStage<\/code>\u00a0\u800c\u975e\u5176\u4ed6\u4e24\u4e2a\u3002<br\/><br\/>\n\u987e\u540d\u601d\u4e49\uff0cCompletableFuture \u4ee3\u8868\u7740\u4e00\u4e2a Future \u5b8c\u6210\u540e\u8be5\u5e72\u70b9\u4ec0\u4e48\uff0c\u5177\u4f53\u5927\u81f4\u6709\uff1a<br\/><br\/>\n<ol>\n<li>Future \u5b8c\u6210\u540e\u6267\u884c\u52a8\u4f5c\uff0c\u6216\u6c42\u53d6\u4e0b\u4e00\u4e2a Future \u7684\u503c\u3002then...<\/li>\n<li>\u591a\u4e2a Future \u7684\u534f\u8c03; \u540c\u65f6\u5b8c\u6210\u8be5\u600e\u4e48\uff0c\u5176\u4e2d\u4e00\u4e2a\u5b8c\u6210\u8be5\u5982\u4f55\u3002allOf, anyOf<\/li>\n<\/ol>\n<br\/>\n\u6709\u65f6\u5019\u53ef\u4ee5\u628a Future \u60f3\u50cf\u6210\u4e0e\u7ebf\u7a0b\u662f\u4e00\u4e00\u5bf9\u5e94\u7684\u3002"},{"title":"\u4f7f\u7528 Java8 Optional \u7684\u6b63\u786e\u59ff\u52bf","link":"https:\/\/yanbin.blog\/proper-ways-of-using-java8-optional\/","pubDate":"Mon, 05 Sep 2016 01:52:54 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/proper-ways-of-using-java8-optional\/","description":"\n\u6211\u4eec\u77e5\u9053 Java 8 \u589e\u52a0\u4e86\u4e00\u4e9b\u5f88\u6709\u7528\u7684 API, \u5176\u4e2d\u4e00\u4e2a\u5c31\u662f Optional. \u5982\u679c\u5bf9\u5b83\u4e0d\u7a0d\u5047\u63a2\u7d22, \u53ea\u662f\u8f7b\u63cf\u6de1\u5199\u7684\u8ba4\u4e3a\u5b83\u53ef\u4ee5\u4f18\u96c5\u7684\u89e3\u51b3 NullPointException \u7684\u95ee\u9898, \u4e8e\u662f\u4ee3\u7801\u5c31\u5f00\u59cb\u8fd9\u4e48\u5199\u4e86<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">Optional<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">User<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">user<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"p\">......<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"k\">if<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"na\">isPresent<\/span><span class=\"p\">())<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"na\">getOrders<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"k\">else<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">Collections<\/span><span class=\"p\">.<\/span><span class=\"na\">emptyList<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u90a3\u4e48\u4e0d\u5f97\u4e0d\u8bf4\u6211\u4eec\u7684\u601d\u7ef4\u4ecd\u7136\u662f\u5728\u539f\u5730\u8e0f\u6b65, \u53ea\u662f\u672c\u80fd\u7684\u8ba4\u4e3a\u5b83\u4e0d\u8fc7\u662f User \u5b9e\u4f8b\u7684\u5305\u88c5, \u8fd9\u4e0e\u6211\u4eec\u4e4b\u524d\u5199\u6210<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">User<\/span><span class=\"w\"> <\/span><span class=\"n\">user<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"p\">.....<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"k\">if<\/span><span class=\"w\"> <\/span><span class=\"p\">(<\/span><span class=\"n\">user<\/span><span class=\"w\"> <\/span><span class=\"o\">!=<\/span><span class=\"w\"> <\/span><span class=\"kc\">null<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">user<\/span><span class=\"p\">.<\/span><span class=\"na\">getOrders<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"p\">}<\/span><span class=\"w\"> <\/span><span class=\"k\">else<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">Collections<\/span><span class=\"p\">.<\/span><span class=\"na\">emptyList<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">6<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n\u5b9e\u8d28\u4e0a\u662f\u6ca1\u6709\u4efb\u4f55\u5206\u522b. \u8fd9\u5c31\u662f\u6211\u4eec\u5c06\u8981\u8bb2\u5230\u7684\u4f7f\u7528\u597d Java 8 Optional \u7c7b\u578b\u7684\u6b63\u786e\u59ff\u52bf.<br\/><br\/>\n\u5728\u91cc\u7ea6\u5965\u8fd0\u4e4b\u65f6, \u65b0\u95fb\u4e00\u518d\u63d0\u8d77\u4e94\u661f\u7ea2\u65d7\u6709\u95ee\u9898, \u53ef\u662f\u6211\u600e\u4e48\u770b\u90fd\u770b\u4e0d\u51fa\u6765\u6709\u4ec0\u4e48\u95ee\u9898, \u540e\u6765\u624d\u9053\u662f\u5c0f\u661f\u661f\u819c\u62dc\u4e2d\u592e\u7684\u59ff\u52bf\u4e0d\u5bf9. \u56e0\u6b64\u6211\u4eec\u5343\u4e07\u4e5f\u522b\u5bf9\u81ea\u5df1\u4e60\u4ee5\u4e3a\u5e38\u7684\u4e8b\u60c5\u89c9\u5f97\u7406\u6240\u5f53\u7136, \u4e1d\u6beb\u4e0d\u4f1a\u89c9\u5f97\u6709\u4f55\u4e0d\u59a5, \u6362\u53e5\u8bdd\u8bf4\u4e5f\u5c31\u662f\u5f53\u6211\u4eec\u5207\u6362\u5230 Java 8 \u7684 Optional \u65f6, \u4e0d\u80fd\u7ee7\u627f\u6027\u7684\u5bf9\u5f85\u8fc7\u5f80 null \u65f6\u7684\u90a3\u79cd\u601d\u7ef4, \u5e94\u8be5\u638c\u63e1\u597d\u65b0\u7684, \u6b63\u786e\u7684\u4f7f\u7528 Java 8 Optional \u7684\u6b63\u786e\u59ff\u52bf."},{"title":"Java 8 \u7684 groupingBy \u4ea7\u751f\u7a7a\u7684 Map \u5206\u7ec4","link":"https:\/\/yanbin.blog\/java-8-groupingby-empty-map-group\/","pubDate":"Fri, 25 Dec 2015 22:25:49 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-groupingby-empty-map-group\/","description":"\n\u524d\u9762\u4e00\u7bc7 <a href=\"https:\/\/yanbin.blog\/java-8-groupingby-howto-generate-empty-map\/\" target=\"_blank\" rel=\"noopener\">Java 8 \u7684 groupingBy \u80fd\u5426\u4ea7\u751f\u7a7a\u7684 Map \u5206\u7ec4<\/a> \u662f\u63d0\u51fa\u6765\u7684\u601d\u8003\uff0c\u672c\u7bc7\u5c31\u662f\u4e0a\u4e00\u7bc7\u7684\u7b54\u6848\u3002<\/p>\n<br\/>\n\u7531\u4e8e\u5728 Java 8 \u4e2d\u7528 Collectors.groupingBy \u5bf9 List \u8fdb\u884c\u5206\u7ec4\u65f6\u6bcf\u4e2a\u7ec4\u91cc\u90fd\u5fc5\u987b\u5b58\u5728\u5143\u7d20\uff0c\u4e5f\u5c31\u662f<br\/>\n<blockquote>\nStream&lt;Person&gt; stream = Stream.of(new Person(\"Tom\", \"male\"), new Person(\"Jerry\", \"male\"));<br \/>\nSystem.out.println(stream.collect(Collectors.groupingBy(person -&gt; person.gender)));\n<\/blockquote>\n\u53ea\u80fd\u5f97\u5230\u7ed3\u679c<br\/>\n<blockquote>\n{male=[Tom, Jerry]}\n<\/blockquote>\n\u800c\u65e0\u6cd5\u8868\u793a\u5b58\u5728\u5176\u4ed6 gender \u7684\u53ef\u80fd\u6027\uff0c\u5e76\u4e14 female=[] \u7684\u60c5\u51b5\uff0c\u5373\u60f3\u8981\u7ed3\u679c<br\/>\n<blockquote>\n{male=[Tom, Jerry], female=[]}\n<\/blockquote>\n\u5982\u679c\u60f3\u5f97\u5230\u4ee5\u4e0a\u7684\u7ed3\u679c\u8be5\u5f53\u5982\u4f55\u5462? stream.collect() \u63a5\u53d7\u4e00\u4e2a Collector, Collectors \u4e2d\u53ea\u662f\u5b9a\u4e49\u4e86\u8bb8\u591a\u5e38\u7528\u7684 Collector \u5b9e\u73b0\uff0c\u5982\u679c\u4e0d\u591f\u7528\u7684\u8bdd\u6211\u4eec\u53ef\u4ee5\u5b9e\u73b0\u81ea\u5df1\u7684 Collector. \u4e0b\u9762\u5c31\u6765\u5b9a\u4e49\u4e00\u4e2a GroupingWithKeys, \u5b83\u9700\u8981\u5b9e\u73b0 java.util.stream.Collector \u63a5\u53e3\uff0c\u6709\u4e94\u4e2a\u63a5\u53e3\u65b9\u6cd5. \u4e8b\u6210\u4e4b\u540e\u6211\u4eec\u5199"},{"title":"Java 8 \u7684 groupingBy \u80fd\u5426\u4ea7\u751f\u7a7a\u7684 Map \u5206\u7ec4","link":"https:\/\/yanbin.blog\/java-8-groupingby-howto-generate-empty-map\/","pubDate":"Fri, 25 Dec 2015 14:14:14 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-groupingby-howto-generate-empty-map\/","description":"\n\u6211\u4eec\u5728 Java 8 \u4e4b\u524d\u7528 for-loop \u5bf9 List \u8fdb\u884c\u5206\u7ec4\u7684\u65f6\u5019\uff0c\u53ef\u80fd\u4f1a\u8981\u6c42\u4ea7\u751f\u7a7a\u7684\u5206\u7ec4\u3002\u4f8b\u5982\u5bf9 List&lt;Person&gt; \u6309\u6027\u80fd\u8fdb\u884c\u5206\u7ec4\uff0c\u5373\u4f7f\u7ed9\u5b9a\u7684 List&lt;Person&gt; \u4e2d\u5168\u662f male, \u6211\u4eec\u4e5f\u60f3\u5f97\u5230 Map \u5305\u542b\u4e24\u4e2a Key<\/p>\n<blockquote>\n{male=[person1, person2], female=[]}\n<\/blockquote>\n\u800c\u4e0d\u53ea\u662f<br\/>\n<blockquote>\n{male=[person1, person2]}\n<\/blockquote>\n\u8fd9\u4e24\u79cd\u8868\u793a\u7565\u6709\u533a\u522b\uff0c\u7b2c\u4e00\u79cd\u65b9\u5f0f\u6697\u793a\u7740\u6709\u53e6\u4e00\u79cd\u53ef\u80fd\u6027\u3002\u770b\u770b for-loop \u5982\u4f55\u5bf9 List&lt;Person&gt; \u8fdb\u884c\u5206\u7ec4\u3002<br\/><br\/>\n\u7c7b Person \u4ee3\u7801"},{"title":"Java 8 \u8fd4\u56de\u96c6\u5408\u4e2d\u7b2c\u4e00\u4e2a\u5339\u914d\u7684\u5143\u7d20","link":"https:\/\/yanbin.blog\/java-8-return-the-first-match-element\/","pubDate":"Thu, 17 Dec 2015 01:10:52 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-return-the-first-match-element\/","description":"\n\u5728 Java 8 \u4e4b\u524d\u5982\u679c\u6211\u4eec\u8981\u627e\u5230\u96c6\u5408\u4e2d\u7b2c\u4e00\u4e2a\u5339\u914d\u5143\u7d20\uff0c\u8981\u4f7f\u7528\u5916\u90e8\u5faa\u73af\uff0c\u5982\u4e0b\u9762\u65b9\u6cd5 findFirstMatch() \u5982\u679c\u627e\u5230\u4e00\u4e2a\u5927\u4e8e 3 \u7684\u6570\u5b57\u7acb\u5373\u8fd4\u56de\u5b83\uff0c\u5426\u5219\u8fd4\u56de null<\/p>\n<blockquote>\n\u00a0 public Integer findFirstMatch() {<br \/>\n\u00a0\u00a0\u00a0 List&lt;Integer&gt; integers = Arrays.asList(1, 4, 2, 5, 6, 3);<br \/>\n\u00a0\u00a0\u00a0 for(int i: integers) {<br \/>\n\u00a0\u00a0\u00a0\u00a0\u00a0 if(i &gt; 3) return i;<br \/>\n\u00a0\u00a0\u00a0 }<br \/>\n\u00a0\u00a0\u00a0 return null;<br \/>\n\u00a0 }\n<\/blockquote>\n\u56e0\u4e3a\u5728 for \u5faa\u73af\u4e2d\u627e\u5230\u7b2c\u4e00\u4e2a\u5927\u4e8e 3 \u7684\u6570\u5b57\u662f 4, \u5e76\u4e14\u7acb\u5373\u8fd4\u56de\uff0c\u6240\u4ee5\u4e0d\u7ba1\u96c6\u5408 integers \u518d\u5927\uff0c\u4e5f\u4e0d\u4f1a\u904d\u5386\u6574\u4e2a\u96c6\u5408\u3002<br\/><br\/>\n\u6ce8\uff1a\u4e0d\u8981\u7ea0\u7ed3\u4e8e\u4e0a\u9762\u793a\u4f8b\u65b9\u6cd5\u7684\u5b9e\u9645\u7528\u9014\uff0c\u5b9e\u9645\u4e0a\u96c6\u4f53\u548c\u5339\u914d\u6761\u4ef6\u90fd\u8be5\u901a\u8fc7\u53c2\u6570\u4f20\u5165\u65b9\u6cd5\u7684\uff0c\u8fd9\u91cc\u53ea\u4f5c\u6f14\u793a\u5faa\u73af\u3002<br\/><br\/>\n\u90a3\u4e48\u6211\u4eec\u6765\u5230 Java 8 \u4e4b\u540e\u7528 Stream API \u8be5\u5982\u4f55\u5b9e\u73b0\uff0c\u7ffb\u904d\u4e86 Stream API, \u80fd\u8fc7\u6ee4\u5143\u7d20\u7684\u64cd\u4f5c\u4e5f\u5c31\u662f filter \u65b9\u6cd5\uff0c\u4e8e\u662f\u5c1d\u8bd5\u8fd9\u6837\u7684\u5199\u6cd5"},{"title":"Java 8 Lambda \u6355\u83b7\u5916\u90e8\u53d8\u91cf","link":"https:\/\/yanbin.blog\/java-8-lambda-capture-outer-variables\/","pubDate":"Fri, 11 Dec 2015 23:30:51 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-lambda-capture-outer-variables\/","description":"\n\u53ef\u80fd\u4f1a\u628a\u6355\u83b7\u5916\u90e8\u53d8\u91cf\u7684 Lambda \u8868\u8fbe\u5f0f\u79f0\u4e3a\u95ed\u5305\uff0c\u90a3\u4e48 Java 8 \u7684 Lambda \u53ef\u4ee5\u6355\u83b7\u4ec0\u4e48\u53d8\u91cf\u5462\uff1f<\/p>\n<br\/>\n<ol>\n<li>\u6355\u83b7\u5b9e\u4f8b\u6216\u9759\u6001\u53d8\u91cf\u662f\u6ca1\u6709\u9650\u5236\u7684(\u53ef\u8ba4\u4e3a\u662f\u901a\u8fc7 final \u7c7b\u578b\u7684\u5c40\u90e8\u53d8\u91cf this \u6765\u5f15\u7528\u524d\u4e24\u8005)<\/li>\n<li>\u6355\u83b7\u7684\u5c40\u90e8\u53d8\u91cf\u5fc5\u987b\u663e\u5f0f\u7684\u58f0\u660e\u4e3a <em>final<\/em> \u6216\u5b9e\u9645\u6548\u679c\u7684\u7684 <em>final<\/em> \u7c7b\u578b<\/li>\n<\/ol>\n<br\/>\n\u56de\u987e\u4e00\u4e0b\u6211\u4eec\u5728 Java 8 \u4e4b\u524d\uff0c\u533f\u540d\u7c7b\u4e2d\u5982\u679c\u8981\u8bbf\u95ee\u5c40\u90e8\u53d8\u91cf\u7684\u8bdd\uff0c\u90a3\u4e2a\u5c40\u90e8\u53d8\u91cf\u5fc5\u987b\u663e\u5f0f\u7684\u58f0\u660e\u4e3a\u00a0 final\uff0c\u4f8b\u5982\u4e0b\u9762\u7684\u4ee3\u7801\u653e\u5728 Java 7 \u4e2d\u662f\u7f16\u8bd1\u4e0d\u8fc7\u7684<br\/>\n<a href=\"https:\/\/yanbin.blog\/posts\/2015\/java-8-lambda-capture-outer-variables\/java7-annymous-capture-local-variable.png\" target=\"_blank\" rel=\"noreferrer\">\n<img class=\"aligncenter post-image\"\nsrc=\"https:\/\/yanbin.blog\/posts\/2015\/java-8-lambda-capture-outer-variables\/java7-annymous-capture-local-variable-800x358.png\"\nwidth=\"500px\"\n\/>\n<\/a>\nJava 7 \u8981\u6c42 version \u8fd9\u4e2a\u5c40\u90e8\u53d8\u91cf\u5fc5\u987b\u662f final\u00a0 \u7c7b\u578b\u7684\uff0c\u5426\u5219\u5728\u533f\u540d\u7c7b\u4e2d\u4e0d\u53ef\u5f15\u7528\u3002"},{"title":"Java 8 Stream \u5982\u4f55\u8fd8\u539f\u4e3a\u96c6\u5408","link":"https:\/\/yanbin.blog\/java-8-stream-to-collection\/","pubDate":"Tue, 08 Dec 2015 02:29:11 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-stream-to-collection\/","description":"\n\u7531\u4e8e Java \u5bf9\u96c6\u5408\u7684\u51fd\u6570\u5f0f\u64cd\u4f5c\u5e76\u975e\u539f\u751f\u6001\u7684\uff0c\u5fc5\u987b\u5bf9\u5f97\u5230\u7684 stream() \u8fdb\u884c\u8fc7\u6ee4\u7b49\u64cd\u4f5c\uff0c\u4e4b\u540e\u8fd8\u662f\u4e00\u4e2a stream()\uff0c\u4e00\u822c\u6211\u4eec\u6700\u540e\u8fd4\u56de\u7ed9\u8c03\u7528\u8005\u9700\u8fd8\u539f\u4e3a\u76f8\u5e94\u7684\u96c6\u5408\u3002\u8fd9\u65e0\u6cd5\u4e0e Scala \u7684 <code>for ... yield<\/code> \u64cd\u4f5c\u76f8\u6bd4\u3002\u4f8b\u5982\u4e0b\u9762\u5728\u4f7f\u7528 Stream API \u8fc7\u6ee4\u83b7\u5f97\u6240\u6709\u5927\u4e8e 3 \u7684\u6570\u5b57\u4e4b\u540e\uff0c\u65b9\u6cd5\u7684\u8fd4\u56de\u503c\u8fd8\u5e94\u8be5\u8fd8\u539f\u4e3a List&lt;Integer&gt;, \u8fd9\u4e2a\u9700\u6c42\u975e\u5e38\u81ea\u7136\n<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">Arrays<\/span><span class=\"p\">.<\/span><span class=\"na\">asList<\/span><span class=\"p\">(<\/span><span class=\"n\">1<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">2<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">3<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">4<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"n\">5<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"nf\">greaterThan3<\/span><span class=\"p\">(<\/span><span class=\"n\">list<\/span><span class=\"p\">)<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">3<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Stream<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Integer<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">streamOfInteger<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"na\">stream<\/span><span class=\"p\">().<\/span><span class=\"na\">filter<\/span><span class=\"p\">(<\/span><span class=\"w\"> <\/span><span class=\"n\">i<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">i<\/span><span class=\"w\"> <\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">3<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">4<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"k\">return<\/span><span class=\"w\"> <\/span><span class=\"n\">streamOfInteger<\/span><span class=\"p\">.<\/span><span class=\"na\">ToIntegerList<\/span><span class=\"p\">......;<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">5<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u6211\u4eec\u8fd9\u513f\u7684\u95ee\u9898\u5c31\u662f\u5982\u4f55\u628a\u4e0a\u9762\u7684 streamOfInteger \u8f6c\u6362\u4e3a List&lt;Integer&gt;, \u6709\u4ee5\u4e0b\u51e0\u79cd\u529e\u6cd5"},{"title":"Java 8 Lambda \u5199\u6cd5\u4e0e\u7b80\u5316","link":"https:\/\/yanbin.blog\/java-8-lambda-simple-ways\/","pubDate":"Mon, 07 Dec 2015 23:06:21 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-lambda-simple-ways\/","description":"\nJava 8 \u7684 Lambda \u8868\u8fbe\u5f0f\u7684\u5b9e\u73b0\u65b9\u5f0f\u8fd8\u662f\u57fa\u4e8e\u5df2\u6709\u7684\u5b57\u8282\u7801\u6307\u4ee4\uff0c\u7531 Lambda \u8868\u8fbe\u5f0f\u7684\u65b9\u6cd5\u7b7e\u540d\u7ed3\u5408\u4e0a\u4e0b\u6587\u5e76\u7ecf\u7531 SAM \u63a8\u65ad\u51fa\u6b63\u786e\u7684\u7c7b\u578b\u6765\u3002Java 8 \u7684 Lambda \u5b8c\u6574\u4e66\u5199\u683c\u5f0f\u662f<\/p>\n<br\/>\n<code>(type parameter1 [type parameter2, ...type parametern]) -&gt; { statements here }<\/code><br\/><br\/>\n\u8fd9\u79cd\u6807\u51c6\u683c\u5f0f\u6240\u8868\u793a\u7684\u5c31\u662f\u65b9\u6cd5\u7b7e\u540d\u3002<br\/><br\/>\n\u867d\u4e0d\u53ca\u5176\u4ed6\u8bed\u8a00\u7684 Lambda \u8868\u8fbe\u5f0f\uff0c\u50cf Swift, Scala \u53ef\u7701\u7565\u53c2\u6570\u90e8\u5206\uff0c\u53ef\u7528\u9ed8\u8ba4\u53c2\u6570\u540d <code>$0<\/code>, <code>$1<\/code>, \u6216 <code>_<\/code>, \u4f46 Java 8 \u7684 Lambda \u8fd8\u662f\u53ef\u4ee5\u8fdb\u884c\u914c\u60c5\u7b80\u5316<br\/>\n<ol>\n<li>\u53c2\u6570\u7c7b\u578b\u603b\u662f\u53ef\u7701\u7565 \u00a0 -- \u00a0 \u00a0 <code>(x, y) -&gt; { x + y; }<\/code><\/li>\n<li>\u53c2\u6570\u4e3a\u4e00\u4e2a\u65f6\uff0c\u53c2\u6570\u62ec\u53f7\u53ef\u7701\u7565\u00a0 -- \u00a0\u00a0 <code>x -&gt; { System.out.println(x); }<\/code><\/li>\n<li>\u8bed\u53e5\u4e3a\u4e00\u6761\u65f6\uff0c\u53ef\u7701\u7565\u5927\u62ec\u53f7, \u5e76\u4e14\u8bed\u53e5\u540e\u4e0d\u8981\u5206\u53f7 --\u00a0 <code>x -&gt; System.out.println(x)<\/code><\/li>\n<li>\u4e0a\u9762\u66f4\u8fdb\u4e00\u6b65\uff0c\u5982\u679c\u662f\u5355\u6761 return \u8bed\u53e5\uff0c\u5fc5\u987b\u628a return \u5173\u952e\u5b57\u53bb\u6389\u00a0 --\u00a0 <code>x -&gt; \"Hello \" + x<\/code><\/li>\n<li>\u5c31\u5dee\u4e00\u70b9\uff0c\u53c2\u6570\u90e8\u5206\u603b\u662f\u4e0d\u80fd\u7701\uff0c\u65e0\u53c2\u5fc5\u987b\u5199\u6210 <code>() -&gt; System.out.println(\"hi\")<\/code><\/li>\n<li>Java 8 \u4e2d\u82e5\u8981\u8fd1\u4f3c\u7684\u5b9e\u73b0\u65e0\u53c2\u6570\u90e8\u5206\u5199\u6cd5\uff0c\u90a3\u5c31\u662f\u65b9\u6cd5\u5f15\u7528\u4e86 -- <code>System.out::println<\/code><\/li>\n<\/ol>"},{"title":"Java 8 \u7684\u6cdb\u578b\u589e\u5f3a","link":"https:\/\/yanbin.blog\/java-8-generic-enhance\/","pubDate":"Wed, 11 Nov 2015 22:16:36 -0600","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/java-8-generic-enhance\/","description":"\nJava 5 \u5f15\u5165\u4e86\u6cdb\u578b\uff0c\u8fd9\u662f\u4e00\u6b21\u91cd\u5927\u7684\u6539\u8fdb\uff0c\u4ece\u6b64\u96c6\u5408\u4e2d\u7684\u4e1c\u897f\u4e0d\u9700\u8981\u6bcf\u6b21\u663e\u5f0f\u7684\u53bb\u8f6c\u578b\u3002\u4e0d\u8fc7 Java 5 \u8fd8\u4e0d\u5177\u5907\u7c7b\u578b\u63a8\u65ad\u7684\u80fd\u529b\uff0c\u6240\u4ee5\u58f0\u660e\u6cdb\u578b\u5fc5\u987b\u5199\u6210<\/p>\n<br\/>\nList&lt;String&gt; list = new ArrayList&lt;String&gt;();<br\/><br\/>\n\u4e00\u76f4\u5230 Java 6 \u4e5f\u662f\u5982\u6b64\u3002\u81ea Java 7 \u8d77\u6cdb\u578b\u589e\u5f3a\u4e3a\u53ef\u6839\u636e\u58f0\u660e\u7c7b\u578b\u8fdb\u884c\u63a8\u65ad\uff0c\u6240\u4ee5 Java 7 \u4e2d\u53ef\u4ee5\u8fd9\u4e48\u5199<br\/><br\/>\nList&lt;String&gt; list = new ArrayList&lt;&gt;();\u00a0 \/\/&lt;&gt; \u4e2d\u7684\u53c2\u6570\u53ef\u7701\u7565\uff0c\u5982\u679c\u7c7b\u578b\u53c2\u6570\u591a, \u6216\u591a\u5c42\u5d4c\u5957\u65f6\u5f88\u7701\u4e8b<br \/>\n\u6216<br \/>\nList&lt;String&gt; list = Collections.emptyList(); \/\/\u89c1\u00a0 <a href=\"https:\/\/yanbin.blog\/java-generic-auto-infer-by-declare-type\/\">Java \u6cdb\u578b -- \u4f9d\u636e\u58f0\u660e\u7684\u53d8\u91cf\u7c7b\u578b\u81ea\u52a8\u63a8\u65ad<\/a><br\/><br\/>\nJava 8 \u5f00\u59cb\u5bf9\u6cdb\u578b\u7c7b\u578b\u63a8\u65ad\u53c8\u8fdb\u4e00\u6b65\u589e\u5f3a\uff1a\u53ef\u6839\u636e\u65b9\u6cd5\u4e0a\u4e0b\u6587\u8fdb\u884c\u63a8\u65ad\uff0c\u4f8b\u5982\u4e0b\u9762\u7684\u4ee3\u7801\u5728 Java 7 \u4e0b\u7f16\u8bd1\u4e0d\u8fc7<br\/>\n<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-java\" data-lang=\"java\"><span class=\"line\"><span class=\"ln\">1<\/span><span class=\"cl\"><span class=\"n\">List<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"w\"> <\/span><span class=\"o\">=<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;&gt;<\/span><span class=\"p\">();<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">2<\/span><span class=\"cl\"><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"na\">addAll<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;&gt;<\/span><span class=\"p\">());<\/span><span class=\"w\"> <\/span><span class=\"o\">\/\/<\/span><span class=\"n\">\u6839\u636e<\/span><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"na\">addAll<\/span><span class=\"p\">()<\/span><span class=\"w\"> <\/span><span class=\"n\">\u4e0a\u4e0b\u6587\u63a8\u65ad\u8981\u521b\u5efa\u7684\u7c7b\u578b\u662f<\/span><span class=\"w\"> <\/span><span class=\"k\">new<\/span><span class=\"w\"> <\/span><span class=\"n\">ArrayList<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">String<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">()<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>"}]}}