{"@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\/tags\/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, 31 Oct 2018 00:13:29 -0500","item":[{"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":"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\/>"},{"title":"\u4ee3\u7801\u4e2d\u5982\u4f55\u83b7\u5f97 Java \u65b9\u6cd5\u7684\u5f62\u5f0f\u53c2\u6570\u540d","link":"https:\/\/yanbin.blog\/retrieve-java-method-formal-parameter-names\/","pubDate":"Sun, 24 Aug 2014 14:07:48 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/retrieve-java-method-formal-parameter-names\/","description":"\n\u5bf9\u4e8e\u4e00\u4e2a Java \u65b9\u6cd5 foo(int id, String name); \u6211\u4eec\u5982\u4f55\u80fd\u5728\u4ee3\u7801\u4e2d\u83b7\u5f97\u5f62\u5f0f\u53c2\u6570\u540d id \u548c name \u5462\uff1f<\/p>\n<br\/>\n\u6211\u4eec\u77e5\u9053\u901a\u8fc7\u53cd\u5c04 API\u00a0<code>Method.getGenericParameterTypes()<\/code> \u53ef\u4ee5\u83b7\u5f97\u65b9\u6cd5\u7684\u53c2\u6570\u7c7b\u578b\uff0c\u4f46\u662f\u5bf9\u4e8e\u53c2\u6570\u540d\u4e00\u822c\u5c31\u662f arg0, arg1, arg2 ..., \u56e0\u4e3a Java \u7f16\u8bd1\u65f6\u628a\u5f62\u5f0f\u53c2\u6570\u540d\u64e6\u9664\u4e86\u3002\u6240\u4ee5\u5bf9\u5b8c\u5168\u64e6\u9664\u4e86\u5f62\u5f0f\u53c2\u6570\u540d\u7684\u5b57\u8282\u7801\u5e94\u8be5\u662f\u6ca1\u529e\u6cd5\u4e86\uff0c\u4f46\u6211\u4eec\u81ea\u5df1\u5199\u7684\u7c7b\u8fd8\u662f\u6709\u80fd\u529b\u53bb\u7ba1\u63a7\u7684\u3002<br\/><br\/>\n\u5bf9\u4e8e\u81ea\u5df1\u5199\u7684\u7c7b\uff0c\u6709\u4e24\u79cd\u529e\u6cd5\u83b7\u5f97\u5f62\u5f0f\u53c2\u6570\u540d\uff0c\u5206\u522b\u662f<br\/><br\/>\n1) Java8 \u7684 -parameters \u7f16\u8bd1\u53c2\u6570\uff0c\u7136\u540e\u7528 Java8 \u65b0\u5f15\u5165\u7684\u53cd\u5c04 API <a href=\"http:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/reflect\/Parameter.html\" target=\"_blank\" rel=\"noopener\">Parameter<\/a><br\/><br\/>\n\u6211\u4eec\u5148\u5728 Java8 \u4e0b\u8fd0\u884c\u4e0b\u9762\u7684\u4ee3\u7801"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u7406\u89e3\u65b0\u5f0f\u96c6\u5408\u64cd\u4f5c","link":"https:\/\/yanbin.blog\/jdk8-lambda-collection-operations\/","pubDate":"Tue, 25 Mar 2014 03:11:11 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-collection-operations\/","description":"\n\u6709\u4e86\u524d\u9762\u7684 SAM\uff0cLambda \u8868\u8fbe\u5f0f\uff0c\u4ee5\u53ca\u9ed8\u8ba4\u63a5\u53e3\u65b9\u6cd5\u4f5c\u94fa\u57ab\u540e\uff0c\u6211\u4eec\u53ef\u4ee5\u53bb\u5f88\u597d\u7684\u53bb\u7406\u89e3 Java8 \u7528 Lambda \u00a0\u8868\u8fbe\u5f0f\u64cd\u4f5c\u96c6\u5408\u7684\u57fa\u672c\u539f\u7406\u4e86\u3002\u6b64\u7bc7\u6211\u4eec\u60f3\u8981\u5316\u89e3\u7684\u793a\u4f8b\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\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=\"kn\">package<\/span><span class=\"w\"> <\/span><span class=\"nn\">cc.unmi<\/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\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 3<\/span><span class=\"cl\"><span class=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.Arrays<\/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=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.Collection<\/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=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.List<\/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=\"kn\">import<\/span><span class=\"w\"> <\/span><span class=\"nn\">java.util.stream.Collectors<\/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\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 8<\/span><span class=\"cl\"><span class=\"cm\">\/**\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\"> 9<\/span><span class=\"cl\"><span class=\"cm\"> * @author Unmi\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">10<\/span><span class=\"cl\"><span class=\"cm\"> *\/<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">11<\/span><span class=\"cl\"><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">class<\/span> <span class=\"nc\">TestJava8Collection<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">12<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"kd\">public<\/span><span class=\"w\"> <\/span><span class=\"kd\">static<\/span><span class=\"w\"> <\/span><span class=\"kt\">void<\/span><span class=\"w\"> <\/span><span class=\"nf\">main<\/span><span class=\"p\">(<\/span><span class=\"n\">String<\/span><span class=\"o\">[]<\/span><span class=\"w\"> <\/span><span class=\"n\">args<\/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\">13<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">Collection<\/span><span class=\"w\"> <\/span><span class=\"n\">collection<\/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=\"s\">&#34;abc&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;cde&#34;<\/span><span class=\"p\">,<\/span><span class=\"w\"> <\/span><span class=\"s\">&#34;efg&#34;<\/span><span class=\"p\">);<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">14<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">List<\/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\">collection<\/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=\"n\">x<\/span><span class=\"w\"> <\/span><span class=\"o\">-&gt;<\/span><span class=\"w\"> <\/span><span class=\"n\">x<\/span><span class=\"p\">.<\/span><span class=\"na\">contains<\/span><span class=\"p\">(<\/span><span class=\"s\">&#34;c&#34;<\/span><span class=\"p\">)).<\/span><span class=\"na\">collect<\/span><span class=\"p\">(<\/span><span class=\"n\">Collectors<\/span><span class=\"p\">.<\/span><span class=\"na\">toList<\/span><span class=\"p\">());<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">15<\/span><span class=\"cl\"><span class=\"w\"> <\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"na\">forEach<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"o\">-&gt;<\/span><span class=\"n\">System<\/span><span class=\"p\">.<\/span><span class=\"na\">out<\/span><span class=\"p\">.<\/span><span class=\"na\">println<\/span><span class=\"p\">(<\/span><span class=\"n\">x<\/span><span class=\"p\">));<\/span><span class=\"w\">\n<\/span><\/span><\/span><span class=\"line\"><span class=\"ln\">16<\/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\">17<\/span><span class=\"cl\"><span class=\"p\">}<\/span><\/span><\/span><\/code><\/pre><\/div>\n<br\/>\n\u5982\u679c\u5bf9\u5176\u4ed6\u652f\u6301\u95ed\u5305\u7684\u8bed\u8a00\uff0c\u5982 JavaScript, Groovy, Ruby, Scala \u7b49\u6709\u6240\u4e86\u89e3\u7684\u8bdd\uff0c\u5f88\u5bb9\u6613\u770b\u51fa\u524d\u9762\u7684\u4ee3\u7801\u8f93\u51fa\u4e3a<br\/>\n<blockquote>\nabc<br \/>\ncde"},{"title":"JDK8 \u7684 Lambda \u8868\u8fbe\u5f0f -- \u9ed8\u8ba4\u548c\u9759\u6001\u63a5\u53e3\u65b9\u6cd5","link":"https:\/\/yanbin.blog\/jdk8-lambda-default-static-interface-methods\/","pubDate":"Tue, 25 Mar 2014 01:41:50 -0500","author":"yabqiu@gmail.com (Yanbin Qiu)","guid":"https:\/\/yanbin.blog\/jdk8-lambda-default-static-interface-methods\/","description":"\n<p>\u8fdb\u5165 Java8 \u4e4b\u540e\u6211\u4eec\u4f1a\u53d1\u73b0\u63a5\u53e3\u53ef\u4ee5\u6709\u65b9\u6cd5\u5b9e\u73b0\u4e86\uff0c\u8fd9\u4e0e\u6211\u4eec\u4e00\u76f4\u770b\u5f85 Java \u63a5\u53e3\u7684\u89c2\u5ff5\u4ea7\u751f\u4e86\u51b2\u7a81\uff0c\u4e0d\u8fc7\u4e5f\u522b\u6025\uff0c\u63a5\u53e3\u4e2d\u7684\u65b9\u6cd5\u5b9e\u73b0\u5fc5\u987b\u662f\u4e00\u4e2a\u9ed8\u8ba4\u65b9\u6cd5\uff0c\u5373\u50cf<\/p>\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\">interface<\/span> <span class=\"nc\">Shape<\/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\">default<\/span><span class=\"w\"> <\/span><span class=\"kt\">boolean<\/span><span class=\"w\"> <\/span><span class=\"nf\">isShape<\/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=\"kc\">true<\/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\">\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\u672c\u6587\u65e8\u5728\u63a2\u8ba8 Java8 \u7684\u9ed8\u8ba4\u63a5\u53e3\u65b9\u6cd5\u5b58\u5728\u7684\u5408\u7406\u6027\uff0cJava8 \u5728\u8fd9\u70b9\u4e0a\u5982\u4f55\u4fdd\u6301\u4e0e\u524d\u9762\u7248\u672c\u7684\u517c\u5bb9\u6027\u3002<br\/><br\/>\nLambda \u548c\u65b9\u6cd5\u5f15\u7528\u4f7f\u5f97 Java \u8bed\u8a00\u66f4\u5177\u8868\u73b0\u529b\u3002\u8bf4\u5230 Lambda \u548c\u65b9\u6cd5\u5f15\u7528\u7684\u5173\u7cfb\uff0cLambda \u8868\u8fbe\u5f0f\u7684\u76ee\u7684\u5c31\u662f\u8ba9\u4f60\u66f4\u4e3a\u4fbf\u6377\u7684\u53bb\u7ed5\u8fc7\u5bf9\u8c61\u76f4\u63a5\u5f15\u7528\u65b9\u6cd5\u3002<br\/><br\/>\n\u63a5\u53e3\u5e94\u8be5\u662f\u76f8\u5bf9\u7a33\u56fa\u7684\uff0c\u6211\u4eec\u5e94\u8be5\u6709\u8fd9\u6837\u7684\u7ecf\u9a8c\uff0c\u7c7b\u4e2d\u4f7f\u7528\u4e86\u63a5\u53e3\u4e2d\u5b9a\u4e49\u7684\u5e38\u91cf\uff0c\u5982\u679c\u5728\u63a5\u53e3\u4e2d\u6539\u53d8\u4e86\u8be5\u5e38\u91cf\u503c\uff0c\u5355\u7eaf\u7684\u66ff\u6362\u63a5\u53e3\u5bf9\u5e94\u7684 class \u6587\u4ef6\u662f\u4e0d\u594f\u6548\u7684\uff0c\u56e0\u4e3a\u7f16\u8bd1\u7c7b\u65f6\u5176\u5b9e\u662f\u628a\u63a5\u53e3\u4e2d\u7684\u5e38\u91cf\u76f4\u63a5\u56fa\u5316\u5728\u7c7b\u4e2d\u4e86\u3002\u5982\u679c\u7c7b\u4e2d\u8981\u4f53\u73b0\u51fa\u6700\u65b0\u5e38\u91cf\u503c\uff0c\u90a3\u4e48\u4f7f\u7528\u63a5\u53e3\u7684\u7c7b\u4e5f\u8981\u91cd\u65b0\u7f16\u8bd1\u3002\u5373\u4f7f\u5728\u63a5\u53e3\u4e2d\u6dfb\u52a0\u6216\u6539\u53d8\u4e86\u65b9\u6cd5\u5b9a\u4e49\uff0c\u4e5f\u4e0d\u80fd\u5f3a\u5236\u4f7f\u7528\u5230\u5b83\u7684\u7c7b\u91cd\u65b0\u7f16\u8bd1\uff0c\u65e9\u5148\u7684\u7c7b\u5b8c\u5168\u53ef\u4ee5\u81ea\u7531\u7684\u8fd0\u884c\uff0c\u56e0\u4e3a\u63a5\u53e3\u4e2d\u5b9a\u4e49\u7684\u5e38\u91cf\u548c\u65b9\u6cd5\u7684\u6240\u6709\u5185\u5bb9\u90fd\u5728\u81ea\u8eab\uff0c\u7c7b\u4e00\u65e6\u7f16\u8bd1\u540e\u4fbf\u53ef\u8131\u79bb\u6240\u5b9e\u73b0\u7684\u63a5\u53e3\u800c\u8fd0\u8f6c\u3002"}]}}