﻿{"id":1885,"date":"2015-01-18T14:38:41","date_gmt":"2015-01-18T05:38:41","guid":{"rendered":"http:\/\/yucchi.jp\/blog\/?p=1885"},"modified":"2015-01-18T14:42:20","modified_gmt":"2015-01-18T05:42:20","slug":"completablefuture-%e3%81%a7%e9%81%8a%e3%81%b6","status":"publish","type":"post","link":"http:\/\/yucchi.jp\/blog\/?p=1885","title":{"rendered":"CompletableFuture \u3067\u904a\u3076"},"content":{"rendered":"<p>\u3042\u3051\u307e\u3057\u3066\u304a\u3081\u3067\u3068\u3046\u3054\u3056\u3044\u307e\u3059\uff01<\/p>\n<p>\u305a\u3044\u3076\u3093\u9045\u3044\u65b0\u5e74\u306e\u6328\u62f6\u3068\u306a\u308a\u307e\u3059\u304c\u672c\u5e74\u3082\u3088\u308d\u3057\u304f\u304a\u9858\u3044\u3057\u307e\u3059\u3002<\/p>\n<p>\u305d\u308c\u3067\u306f\u65b0\u5e74\uff11\u767a\u76ee\u306e\u30cd\u30bf\u306f\u79c1\u306e\u611b\u3059\u308b Java \u3067\u3059\uff01<\/p>\n<p>Java 8 \u306e\u65b0\u6a5f\u80fd\u3067\u3042\u308b CompletableFuture \u306e\u8a73\u7d30\u304c\u4e0b\u8a18\u30b5\u30a4\u30c8\u3067\u89e3\u8aac\u3055\u308c\u306f\u3058\u3081\u307e\u3057\u305f\u3002<\/p>\n<p><a href=\"http:\/\/itpro.nikkeibp.co.jp\/atcl\/column\/14\/224071\/010400014\/\" target=\"_blank\">\u8a73\u89e3 Java SE 8 \u7b2c19\u56de Concurrency Utilities\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8 \u305d\u306e1<\/a><\/p>\n<p>Java 8 \u304c\u6b63\u5f0f\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u308b\u524d\u304b\u3089\u6c17\u306b\u306f\u306a\u3063\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u6d77\u5916\u306e\u30b5\u30a4\u30c8\u3067\u3082\u60c5\u5831\u91cf\u304c\u5c11\u306a\u304f\u82f1\u8a9e\u304c\u3088\u304f\u89e3\u3089\u306a\u3044\u306e\u3067\u6b63\u3057\u3044\u4f7f\u3044\u65b9\u304c\u89e3\u3089\u305a\u306b\u3044\u307e\u3057\u305f\u3002<\/p>\n<p>\u304a\u307e\u3051\u306b Java API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3082\u305d\u306e\u5f53\u6642\u306f\u65e5\u672c\u8a9e\u306e\u3082\u306e\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002<\/p>\n<p>\u73fe\u5728\u306f\u65e5\u672c\u8a9e\u306e API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3082\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3046\u308c\u3057\u3044\u9650\u308a\u3067\u3059\u3002<\/p>\n<p>\u305d\u308c\u3067\u306f\u3068\u308a\u3042\u3048\u305a\u4f55\u304b\u9069\u5f53\u306b\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u7d44\u3093\u3067\u307f\u308b\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n<p>\u304a\u6b63\u6708\u3068\u3044\u3046\u3053\u3068\u3067\u3061\u3087\u3063\u3068\u3075\u3056\u3051\u305f\u5185\u5bb9\u3068\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u30cd\u30bf\u304c\u30cd\u30bf\u3060\u3051\u306b\u3054\u3081\u3093\u306a\u3055\u3044\u3068\u5148\u306b\u884c\u3063\u3066\u304a\u304d\u307e\u3059\u3002\uff08\u30f2\u30d2<\/p>\n<p>\u4eca\u56de\u306e\u30cd\u30bf\u306f CompletableFuture \u3092\u4f7f\u3063\u3066\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u9ad8\u901f\u5316\u3059\u308b\u3067\u3059\u3002\uff08\u305d\u3093\u306a\u5927\u8888\u88df\u306a\u3082\u306e\u3058\u3083\u306a\u3044\u3057\u3001\u4f7f\u308f\u306a\u304f\u3066\u3082\u53ef\u80fd\u306a\u306e\u306f\u79d8\u5bc6\u3067\u3059\u3002\uff09<\/p>\n<p><font color=\"#0000ff\">\u3042\u306a\u305f\u306f\u3001\u3042\u308b IT \u4f01\u696d\u306b\u52e4\u3081\u3066\u3044\u307e\u3059\u3002\u4eca\u56de\u3042\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30ea\u30fc\u30c0\u30fc\u3092\u4efb\u3055\u308c\u307e\u3057\u305f\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u3042\u306a\u305f\u306f\u4f55\u4eba\u304b\u30e1\u30f3\u30d0\u30fc\u3092\u9078\u51fa\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u305d\u3053\u3067\u5e0c\u671b\u8005\u3092\u52df\u3063\u305f\u3068\u3053\u308d\u3001\u305f\u304f\u3055\u3093\u306e\u9b45\u529b\u7684\u306a\u5973\u6027\u30d7\u30ed\u30b0\u30e9\u30de\u9054\u304c\u3042\u306a\u305f\u3092\u53d6\u308a\u56f2\u307f\u307e\u3057\u305f\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u4e88\u60f3\u5916\u306e\u51fa\u6765\u4e8b\u306b\u3042\u306a\u305f\u306f\u5927\u559c\u3073\u3067\u5168\u54e1\u3092\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30c1\u30fc\u30e0\u306b\u52a0\u3048\u3088\u3046\u3068\u3057\u307e\u3057\u305f\u304c\u30fb\u30fb\u30fb<\/font><\/p>\n<p><font color=\"#0000ff\">\u306a\u3093\u3068\u5973\u6027\u9054\u306f\u96a3\u306e\u5973\u6027\u3092\u30c1\u30fc\u30e0\u306b\u52a0\u3048\u308b\u306a\u3089\u79c1\u306f\u8f9e\u9000\u3059\u308b\u3068\u8a00\u3044\u307e\u3059\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u305f\u3068\u3048\u3070\u3001A\u5b50\u3001B\u5b50\u3001C\u5b50\u3001D\u5b50\u3001E\u5b50 \u3068\u8a00\u3046\u5177\u5408\u306b\u3042\u306a\u305f\u3092\u4e2d\u5fc3\u306b\u53d6\u308a\u56f2\u3093\u3067\u3044\u308b\u3068\u3057\u305f\u3089<\/font><\/p>\n<p><font color=\"#0000ff\">A\u5b50\u3092\u30e1\u30f3\u30d0\u30fc\u306b\u52a0\u3048\u308b\u3068\u3001B\u5b50\u3001E\u5b50\u306f\u30c1\u30fc\u30e0\u306b\u52a0\u3048\u308b\u3053\u3068\u306f\u51fa\u6765\u306a\u3044\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">B\u5b50\u3092\u30e1\u30f3\u30d0\u30fc\u306b\u52a0\u3048\u308b\u3068\u3001A\u5b50\u3068 C\u5b50\u306f\u30c1\u30fc\u30e0\u306b\u52a0\u3048\u308b\u3053\u3068\u306f\u3067\u304d\u306a\u3044\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u56f0\u308a\u307e\u3057\u305f\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u305d\u3053\u3067\u3042\u306a\u305f\u306f\u80f8\u30dd\u30b1\u30c3\u30c8\u304b\u3089\u300c\u304a\u3063\u3071\u3044\u30b9\u30ab\u30a6\u30bf\u30fc\u300d\u3068\u3044\u3046\u79d8\u5bc6\u5175\u5668\u3092\u53d6\u308a\u51fa\u3057\u5973\u6027\u9054\u306e\u30d0\u30b9\u30c8\u3092\u8a08\u6e2c\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u307e\u3057\u305f\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u305d\u3046\u3001\u3042\u306a\u305f\u306f\u3001\u304a\u3063\u3071\u3044\u661f\u4eba\u3060\u3063\u305f\u306e\u3067\u3059\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u305d\u308c\u3092\u5229\u7528\u3057\u3066\u30c1\u30fc\u30e0\u306b\u52a0\u3048\u308b\u5973\u6027\u9054\u306e\u30d0\u30b9\u30c8\u306e\u5408\u8a08\u5024\u304c\u6700\u5927\u306b\u306a\u308b\u3088\u3046\u306b\u9078\u51fa\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u3053\u308c\u304b\u3089\u3082\u3053\u3046\u3044\u3046\u3053\u3068\u304c\u3061\u3087\u304f\u3061\u3087\u304f\u3042\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u306e\u3067\u3042\u306a\u305f\u306f\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u7d44\u3080\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u3055\u3066\u3001\u3042\u306a\u305f\u306a\u3089\u3069\u3093\u306a\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u7d44\u3080\u3067\u3057\u3087\u3046\uff1f\uff08Java 8 \u3067\u7d44\u3080\u3053\u3068\uff09<\/font><\/p>\n<p><font color=\"#0000ff\">\u5973\u6027\u30d7\u30ed\u30b0\u30e9\u30de\u9054\u306e\u30d0\u30b9\u30c8\u306e\u30b5\u30a4\u30ba\u306f\u914d\u5217\u306b\u4e71\u6570\u3092\u751f\u6210\u3057\u3066\u683c\u7d0d\u3057\u307e\u3059\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u914d\u5217\u306e\u8981\u7d20\u6570\u306f\u5973\u6027\u30d7\u30ed\u30b0\u30e9\u30de\u306e\u4eba\u6570\u3068\u306a\u308a\u307e\u3059\u3002<\/font><\/p>\n<p><font color=\"#0000ff\">\u3055\u3066\u3001\u3042\u306a\u305f\u306a\u3089\u3069\u3093\u306a\u30b3\u30fc\u30c9\u3092\u66f8\u304f\u3067\u3057\u3087\u3046\u304b\uff1f<\/font><\/p>\n<p>\u6700\u3082\u7c21\u5358\u306a\u4f8b\u306f\u6b21\u306e\u3088\u3046\u306a\u30b3\u30fc\u30c9\u306b\u306a\u308b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p><pre title=\"OppaiGenerator.java\">\r\npackage jp.yucchi.oppaialien;\r\n\r\nimport java.security.SecureRandom;\r\nimport java.util.Random;\r\nimport java.util.stream.Stream;\r\n\r\n\/**\r\n *\r\n * @author Yucchi\r\n *\/\r\npublic class OppaiGenerator {\r\n\r\n    Random random = new SecureRandom();\r\n\r\n    int[] oppai = Stream.generate(random::nextDouble)\r\n            .mapToDouble(e -> e)\r\n            .filter(e -> (e >= 0.7 && e < 1.2))\r\n            .mapToInt(e -> (int) (e * 100))\r\n            .limit(7)\r\n            .toArray();\r\n\r\n}\r\n\r\n<\/pre>\n<\/p>\n<p><pre title=\"OppaiSearch.java\">\r\npackage jp.yucchi.oppaialien;\r\n\r\nimport java.security.SecureRandom;\r\nimport java.util.Random;\r\nimport java.util.concurrent.TimeUnit;\r\nimport java.util.logging.Level;\r\nimport java.util.logging.Logger;\r\nimport java.util.stream.IntStream;\r\n\r\n\/**\r\n *\r\n * @author Yucchi\r\n *\/\r\nclass OppaiSearch {\r\n\r\n    private final int option;\r\n    private final int[] oppai;\r\n    private int result;\r\n\r\n    OppaiSearch(int option, int[] oppai) {\r\n        this.option = option;\r\n        this.oppai = oppai;\r\n    }\r\n\r\n    public int getOppaiTask() {\r\n\r\n        Random random = new SecureRandom();\r\n\r\n        int GIRLS = oppai.length;\r\n        int[] dp = new int[GIRLS];\r\n\r\n        IntStream.range(0, GIRLS - 1).forEach(e -> {\r\n\r\n            try {\r\n                TimeUnit.MILLISECONDS.sleep(random.nextInt(1_000));\r\n            } catch (InterruptedException ex) {\r\n                Logger.getLogger(OppaiSearch.class.getName()).log(Level.SEVERE, null, ex);\r\n            }\r\n\r\n            dp[e] = oppai[e + option];\r\n            if (e > 0) {\r\n                dp[e] = Math.max(dp[e], dp[e - 1]);\r\n            }\r\n            if (e > 1) {\r\n                dp[e] = Math.max(dp[e], dp[e - 2] + oppai[e + option]);\r\n            }\r\n\r\n            result = Math.max(result, dp[e]);\r\n            System.out.println(Thread.currentThread().getName() + \" : \" + result);\r\n        });\r\n\r\n        return result;\r\n\r\n    }\r\n\r\n}\r\n\r\n<\/pre>\n<\/p>\n<p><pre title=\"OppaiAlien.java\">\r\npackage jp.yucchi.oppaialien;\r\n\r\nimport java.util.Arrays;\r\n\r\n\/**\r\n *\r\n * @author Yucchi\r\n *\/\r\npublic class OppaiAlien {\r\n\r\n    \/**\r\n     * @param args the command line arguments\r\n     *\/\r\n    public static void main(String[] args) {\r\n\r\n        OppaiGenerator oppaiGenerator = new OppaiGenerator();\r\n\r\n        System.out.println(Arrays.toString(oppaiGenerator.oppai) + \"\\n\");\r\n\r\n        OppaiSearch oppai_0 = new OppaiSearch(0, oppaiGenerator.oppai);\r\n        OppaiSearch oppai_1 = new OppaiSearch(1, oppaiGenerator.oppai);\r\n\r\n        int maxOppai_0 = oppai_0.getOppaiTask();\r\n        int maxOppai_1 = oppai_1.getOppaiTask();\r\n\r\n        System.out.println(Thread.currentThread().getName() + \"\u304a\u3063\u3071\u3044\u306e\u30b5\u30a4\u30ba\u306e\u6700\u5927\u7dcf\u548c\u306f \" + Math.max(maxOppai_0, maxOppai_1) + \"\u3067\u3059\u3002\");\r\n\r\n    }\r\n\r\n}\r\n<\/pre>\n<\/p>\n<p>\u30c7\u30d0\u30c3\u30b0\u7528\u306b\u5fc5\u8981\u306e\u7121\u3044\u3082\u306e\u304c\u3042\u308a\u307e\u3059\u304c\u6c17\u306b\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u4e00\u898b\u3001\u5b9f\u306b\u30b7\u30f3\u30d7\u30eb\u3067\u3044\u3066\u5408\u7406\u7684\u306a\u3088\u3046\u306b\u898b\u3048\u307e\u3059\u3002<\/p>\n<p>\u305d\u308c\u3067\u306f\u52d5\u304b\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2015\/01\/1.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"1\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"1\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2015\/01\/1_thumb.png\" width=\"288\" height=\"320\"><\/a><\/p>\n<p>\u9806\u756a\u306b\u51e6\u7406\u3055\u308c\u3066\u3044\u308b\u306e\u304c\u89e3\u308a\u307e\u3059\u3002<\/p>\n<p>\u51e6\u7406\u6642\u9593\u306f OppaiSearch \u30af\u30e9\u30b9\u306e getOppaiTask() \u30e1\u30bd\u30c3\u30c9\u306e\u4e2d\u306e\u30eb\u30fc\u30d7\u51e6\u7406\u4e2d\u306b\u30e9\u30f3\u30c0\u30e0\u306a\u30b9\u30ea\u30fc\u30d7\u3092\u5c11\u3057\u631f\u3093\u3067\u3044\u308b\u306e\u3067\u6c17\u306b\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u9ad8\u901f\u5316\u3059\u308b\u306b\u306f getOppaiTask() \u30e1\u30bd\u30c3\u30c9\u3092\u4e26\u884c\u51e6\u7406\u3057\u3066\u3057\u307e\u3046\u306e\u304c\u624b\u3063\u53d6\u308a\u65e9\u3044\u3067\u3059\u306d\uff01<\/p>\n<p>\u305d\u3053\u3067 CompletableFuture \u3092\u4f7f\u3063\u3066\u697d\u306b\u9ad8\u901f\u5316\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>OppaiAlien \u30af\u30e9\u30b9\u3092\u6b21\u306e\u3088\u3046\u306b\u5909\u66f4\u3057\u307e\u3059\u3002<\/p>\n<p><pre title=\"OppaiAlien.java\">\r\npackage jp.yucchi.oppaialien;\r\n\r\nimport java.util.Arrays;\r\nimport java.util.concurrent.CompletableFuture;\r\nimport java.util.concurrent.ExecutionException;\r\nimport java.util.concurrent.TimeUnit;\r\nimport java.util.concurrent.TimeoutException;\r\nimport java.util.logging.Level;\r\nimport java.util.logging.Logger;\r\n\r\n\/**\r\n *\r\n * @author Yucchi\r\n *\/\r\npublic class OppaiAlien {\r\n\r\n    private static Integer result;\r\n\r\n    \/**\r\n     * @param args the command line arguments\r\n     *\/\r\n    public static void main(String[] args) {\r\n\r\n        OppaiGenerator oppaiGenerator = new OppaiGenerator();\r\n\r\n        System.out.println(Arrays.toString(oppaiGenerator.oppai) + \"\\n\");\r\n\r\n        OppaiSearch oppai_0 = new OppaiSearch(0, oppaiGenerator.oppai);\r\n        OppaiSearch oppai_1 = new OppaiSearch(1, oppaiGenerator.oppai);\r\n\r\n        CompletableFuture<Integer> future0 = CompletableFuture.supplyAsync(() -> oppai_0.getOppaiTask());\r\n        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> oppai_1.getOppaiTask());\r\n\r\n        \/\/ \u4e21\u65b9\u306e\u51e6\u7406\u304c\u7d42\u308f\u3063\u3066\u304b\u3089\u8a08\u7b97\u5024\u304c\u5927\u304d\u3044\u65b9\u3092\u8fd4\u3059\u3002\r\n        CompletableFuture<Integer> f = future0.thenCombine(future1, (f0, f1) -> {\r\n            System.out.println(Thread.currentThread().getName() + \" : CompletableFuture<Integer> f\");\r\n            return Math.max(f0, f1);\r\n        });\r\n\r\n        try {\r\n            result = f.get(3, TimeUnit.SECONDS);\r\n        } catch (InterruptedException | ExecutionException ex) {\r\n            Logger.getLogger(OppaiAlien.class.getName()).log(Level.SEVERE, null, ex);\r\n        } catch (TimeoutException ex) {\r\n            f.complete(-1);\r\n            try {\r\n                result = f.get();\r\n            } catch (InterruptedException | ExecutionException ex1) {\r\n                Logger.getLogger(OppaiAlien.class.getName()).log(Level.SEVERE, null, ex1);\r\n            }\r\n        }\r\n\r\n        if (result < 0) {\r\n            System.out.println(\"Timeout. Please use a more high-performance computer\");\r\n        } else {\r\n            System.out.println(Thread.currentThread().getName() + \"\u304a\u3063\u3071\u3044\u306e\u30b5\u30a4\u30ba\u306e\u6700\u5927\u7dcf\u548c\u306f \" + result + \"\u3067\u3059\u3002\");\r\n        }\r\n\r\n    }\r\n\r\n}\r\n\r\n<\/pre>\n<\/p>\n<p>\u898b\u6163\u308c\u306a\u3044\u30b3\u30fc\u30c9\u304c\u3042\u308a\u307e\u3059\u306d\u3002<\/p>\n<p>\u6b21\u306e\u3088\u3046\u306b supplyAsync() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3063\u3066 CompletableFuture\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u751f\u6210\u3057\u307e\u3059\u3002<\/p>\n<blockquote>\n<p><font color=\"#666666\">CompletableFuture&lt;Integer&gt; future0 = CompletableFuture.supplyAsync(() -&gt; oppai_0.getOppaiTask());<br \/>CompletableFuture&lt;Integer&gt; future1 = CompletableFuture.supplyAsync(() -&gt; oppai_1.getOppaiTask());<\/font><\/p>\n<\/blockquote>\n<p>\u305d\u3057\u3066 supplyAsync() \u30e1\u30bd\u30c3\u30c9\u3067\u4f5c\u3063\u305f\u4e8c\u3064\u306e CompletableFuture\u30aa\u30d6\u30b8\u30a7\u30af\u30c8 \u3092\u975e\u540c\u671f\u3067\u51e6\u7406\u3055\u305b\u307e\u3059\u3002<\/p>\n<p>supplyAsync() \u30e1\u30bd\u30c3\u30c9\u306f API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3067\u306f\u6b21\u306e\u3088\u3046\u306b\u8aac\u660e\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>public static &lt;U&gt; CompletableFuture&lt;U&gt; supplyAsync(Supplier&lt;U&gt; supplier)<\/p>\n<p>ForkJoinPool.commonPool()\u3067\u5b9f\u884c\u3055\u308c\u3066\u3044\u308b\u30bf\u30b9\u30af\u304c\u6307\u5b9a\u3055\u308c\u305f\u30b5\u30d7\u30e9\u30a4\u30e4\u3092\u547c\u3073\u51fa\u3057\u3066\u53d6\u5f97\u3057\u305f\u5024\u3092\u4f7f\u7528\u3057\u3066\u975e\u540c\u671f\u7684\u306b\u5b8c\u4e86\u3059\u308b\u65b0\u3057\u3044CompletableFuture\u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n<p>\u305d\u308c\u3067\u306f\u6b21\u306b\u3053\u308c\u3089\u304b\u3089\u5f97\u3089\u308c\u308b\u5024\u306e\u5927\u304d\u306a\u307b\u3046\u304c\u6700\u7d42\u7684\u306a\u7d50\u679c\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u5b9f\u306f\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u306f\u3061\u3087\u3063\u3068\u904a\u3073\u304c\u5165\u3063\u3066\u3044\u308b\u306e\u3067\u672c\u6765\u306e\u76ee\u7684\u3060\u3051\u3092\u9054\u6210\u3059\u308b\u306b\u306f\u6b21\u306e\u30b3\u30fc\u30c9\u3067\u5b8c\u4e86\u3055\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<blockquote>\n<p><font color=\"#666666\">try {<br \/>&nbsp;&nbsp;&nbsp; System.out.println(\"\u304a\u3063\u3071\u3044\u306e\u30b5\u30a4\u30ba\u306e\u6700\u5927\u7dcf\u548c\u306f \" + Math.max(future0.get(), future1.get()) + \"\u3067\u3059\u3002\");<br \/>&nbsp;&nbsp;&nbsp; System.out.println(\"\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u7d42\u4e86\u3057\u307e\u3059\u3002\");<br \/>&nbsp;&nbsp;&nbsp; } catch (InterruptedException | ExecutionException ex) {<br \/>&nbsp;&nbsp;&nbsp; Logger.getLogger(OppaiAlien.class.getName()).log(Level.SEVERE, null, ex);<br \/>}<br \/><\/font><\/p>\n<\/blockquote>\n<p>get() \u30e1\u30bd\u30c3\u30c9\u306f\u51e6\u7406\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u5f85\u3064\u306e\u3067\u4e21\u65b9\u306e\u975e\u540c\u671f\u51e6\u7406\u306e\u7d50\u679c\u3092\u53d6\u5f97\u3057\u3066\u304b\u3089 Math.max() \u30e1\u30bd\u30c3\u30c9\u306f\u5b9f\u884c\u3055\u308c\u307e\u3059\u3002<\/p>\n<p>\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f thenCombine() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3063\u3066\u3001<font color=\"#000000\">CompletableFuture&lt;Integer&gt; future0 \u3068 <\/font><font color=\"#000000\">CompletableFuture&lt;Integer&gt; future1 \u306e\u4e21\u65b9\u306e\u51e6\u7406\u304c\u7d42\u308f\u308b\u307e\u3067\u5f85\u3063\u3066<\/font><\/p>\n<p>\u305d\u308c\u3089\u3092\u4f7f\u3063\u3066\u51e6\u7406\u3092\u3057\u3066\u7d50\u679c\u3092\u8fd4\u3059\u3088\u3046\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<blockquote>\n<p><font color=\"#666666\">\/\/ \u4e21\u65b9\u306e\u51e6\u7406\u304c\u7d42\u308f\u3063\u3066\u304b\u3089\u8a08\u7b97\u5024\u304c\u5927\u304d\u3044\u65b9\u3092\u8fd4\u3059\u3002<br \/>CompletableFuture&lt;Integer&gt; f = future0.thenCombine(future1, (f0, f1) -&gt; {<br \/>&nbsp;&nbsp;&nbsp; System.out.println(Thread.currentThread().getName() + \" : CompletableFuture&lt;Integer&gt; f\");<br \/>&nbsp;&nbsp;&nbsp; return Math.max(f0, f1);<br \/>});<\/font><\/p>\n<\/blockquote>\n<p><font color=\"#666666\"><\/font>thenCombine() \u30e1\u30bd\u30c3\u30c9\u306f API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306b\u3088\u308b\u3068\u6b21\u306e\u3088\u3046\u306b\u8aac\u660e\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>public &lt;U,V&gt; CompletableFuture&lt;V&gt; thenCombine(CompletionStage&lt;? extends U&gt; other,<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BiFunction&lt;? super T,? super U,? extends V&gt; fn)<\/p>\n<p>\u3053\u306e\u30b9\u30c6\u30fc\u30b8\u3068\u6307\u5b9a\u3055\u308c\u305f\u4ed6\u306e\u30b9\u30c6\u30fc\u30b8\u306e\u4e21\u65b9\u304c\u6b63\u5e38\u7d42\u4e86\u3057\u305f\u969b\u306b\u5b9f\u884c\u3055\u308c\u308b\u65b0\u3057\u3044CompletionStage\u3092\u8fd4\u3057\u307e\u3059(\u5b9f\u884c\u6642\u306b\u306f\u3001\u6307\u5b9a\u3055\u308c\u305f\u95a2\u6570\u306e\u5f15\u6570\u3068\u3057\u30662\u3064\u306e\u7d50\u679c\u304c\u4f7f\u7528\u3055\u308c\u308b)\u3002<\/p>\n<p>\u305d\u308c\u3067\u306f\u5148\u306b\u9032\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p>\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f\u3055\u3089\u306b\u4f59\u8a08\u306a\u3053\u3068\u3092\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>get() \u30e1\u30bd\u30c3\u30c9\u306b\u30bf\u30a4\u30e0\u30ea\u30df\u30c3\u30c8\u3092\u8a2d\u5b9a\u3057\u307e\u3057\u305f\u3002(^_^;)<\/p>\n<blockquote>\n<p><font color=\"#666666\">result = f.get(3, TimeUnit.SECONDS);<\/font><\/p>\n<\/blockquote>\n<p>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3057\u305f\u3089<\/p>\n<blockquote>\n<p><font color=\"#666666\">f.complete(-1);<\/font><\/p>\n<\/blockquote>\n<p>\u3068\u3001CompletableFuture&lt;Integer&gt; f \u306b \u20131 \u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<p>\u5b9f\u306f\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f\u3053\u3093\u306a\u3053\u3068\u3092\u305b\u305a\u306b\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u304c\u767a\u751f\u3057\u305f\u3089 result \u306b \u20131 \u3092\u4ee3\u5165\u3059\u308c\u3070\u3044\u3044\u3060\u3051\u306a\u3093\u3067\u3059\u304c complete() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3044\u305f\u304b\u3063\u305f\u304b\u3089\u3053\u3046\u306a\u3063\u305f\u3060\u3051\u3067\u3059\u3002(\uffe3\u3002\uffe3;)<\/p>\n<p>\u305d\u308c\u3067\u306f\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5b9f\u884c\u7d50\u679c\u3092\u898b\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2015\/01\/2.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"2\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"2\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2015\/01\/2_thumb.png\" width=\"447\" height=\"330\"><\/a><\/p>\n<p>Fork\/Join Framework \u304c\u4f7f\u308f\u308c\u3066\u4e26\u884c\u51e6\u7406\u3055\u308c\u3066\u3044\u308b\u306e\u304c\u89e3\u308a\u307e\u3059\u3002<\/p>\n<p>\u307e\u305f\u3001\u4e21\u65b9\u306e\u51e6\u7406\u304c\u5b8c\u4e86\u3055\u308c\u3066\u304b\u3089\u6700\u7d42\u7684\u306a\u51e6\u7406\u3082\u3055\u308c\u3066\u3044\u308b\u306e\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306e\u76ee\u7684\u3067\u3042\u308b\u4e26\u884c\u51e6\u7406\u306b\u3088\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u9ad8\u901f\u5316\u3092 CompletableFuture \u3092\u4f7f\u3063\u3066\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3057\u305f\u3002(^_^)<\/p>\n<p>\u305f\u3060\u3001\u3053\u308c\u3067\u3044\u3044\u306e\u304b\uff1f\u305d\u308c\u3068\u3082\u3082\u3063\u3068\u826f\u3044\u4f7f\u3044\u65b9\u304c\u3042\u308b\u306e\u304b\u306f\u4e0d\u660e\u3067\u3059\u3002<\/p>\n<p>\u3053\u308c\u304b\u3089\u306e <a href=\"http:\/\/itpro.nikkeibp.co.jp\/atcl\/column\/14\/224071\/010400014\/\" target=\"_blank\">\u8a73\u89e3 Java SE 8 \u7b2c19\u56de Concurrency Utilities\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8<\/a> \u306e\u8a18\u4e8b\u306b\u6ce8\u76ee\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\uff01<\/p>\n<p>\u3053\u3053\u304b\u3089\u306f\u304a\u307e\u3051\u3067\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f\u4e21\u65b9\u306e\u51e6\u7406\u304c\u5b8c\u4e86\u3059\u308b\u306e\u3092\u5f85\u3063\u3066\u307e\u3057\u305f\u3002<\/p>\n<p>\u5148\u306b\u7d42\u4e86\u3057\u305f\u65b9\u3092\u8868\u793a\u3059\u308b\u3060\u3051\u306e\u5834\u5408\u3082\u8a66\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>\u6700\u7d42\u51e6\u7406\u3092\u3053\u3061\u3089\u306b\u5909\u66f4\u3057\u307e\u3059\u3002<\/p>\n<p>applyToEither() \u30e1\u30bd\u30c3\u30c9\u3092\u4f7f\u3044\u307e\u3059\u3002<\/p>\n<p>\u3053\u308c\u306f\u3069\u3061\u3089\u304b\u304c\u51e6\u7406\u7d50\u679c\u3092\u5f97\u3089\u308c\u308c\u3070\u3001\u305d\u306e\u7d50\u679c\u3092\u6307\u5b9a\u3055\u308c\u305f\u95a2\u6570\u306b\u6e21\u3057\u307e\u3059\u3002<\/p>\n<blockquote>\n<p><font color=\"#666666\">\/\/ \u51e6\u7406\u304c\u65e9\u304f\u7d42\u308f\u3063\u305f\u65b9\u3092\u8fd4\u3059\u3002<br \/>CompletableFuture&lt;Integer&gt; f = future0.applyToEither(future1, x -&gt; {<br \/>&nbsp;&nbsp;&nbsp; return x;<br \/>});<\/font><\/p>\n<\/blockquote>\n<p>applyToEither() \u30e1\u30bd\u30c3\u30c9 \u306f API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3067\u306f\u6b21\u306e\u3088\u3046\u306b\u8aac\u660e\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>public &lt;U&gt; CompletableFuture&lt;U&gt; applyToEither(CompletionStage&lt;? extends T&gt; other,<br \/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Function&lt;? super T,U&gt; fn)<\/p>\n<p>\u3053\u306e\u30b9\u30c6\u30fc\u30b8\u307e\u305f\u306f\u6307\u5b9a\u3055\u308c\u305f\u4ed6\u306e\u30b9\u30c6\u30fc\u30b8\u304c\u6b63\u5e38\u306b\u5b8c\u4e86\u3057\u305f\u3068\u304d\u306b\u3001\u5bfe\u5fdc\u3059\u308b\u7d50\u679c\u3092\u6307\u5b9a\u3055\u308c\u305f\u95a2\u6570\u3078\u306e\u5f15\u6570\u306b\u8a2d\u5b9a\u3057\u3066\u5b9f\u884c\u3055\u308c\u308b\u65b0\u3057\u3044CompletionStage\u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n<p>\u305d\u308c\u3067\u306f\u5b9f\u884c\u7d50\u679c\u3092\u898b\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p><a href=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2015\/01\/3.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" title=\"3\" style=\"border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px\" border=\"0\" alt=\"3\" src=\"http:\/\/yucchi.jp\/blog\/wp-content\/uploads\/2015\/01\/3_thumb.png\" width=\"324\" height=\"286\"><\/a><\/p>\n<p>\u307e\u3060\u7247\u65b9\u3057\u304b\u51e6\u7406\u304c\u7d42\u308f\u3063\u3066\u306a\u3044\u306e\u306b\u6700\u7d42\u51e6\u7406\u304c\u3055\u308c\u3066\u3044\u308b\u306e\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>\u76ee\u7684\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3068\u3057\u3066\u306f\u99c4\u76ee\u3067\u3059\u304c\u3001\u3042\u304f\u307e\u3067\u53c2\u8003\u3068\u3044\u3046\u3053\u3068\u3067\uff01<\/p>\n<p>\u9593\u9055\u3044\u3001\u3082\u3057\u304f\u306f\u3082\u3063\u3068 COOL \u306a\u65b9\u6cd5\u304c\u3042\u308c\u3070\u6559\u3048\u3066\u3044\u305f\u3060\u3051\u308c\u3070\u5e78\u3044\u3067\u3059\u3002<\/p>\n<div id=\"scid:0767317B-992E-4b12-91E0-4F059A8CECA8:769bdeb5-d2f5-49b4-85c7-bc062ab44d04\" class=\"wlWriterEditableSmartContent\" style=\"float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px\">Hatena \u30bf\u30b0: <a href=\"http:\/\/b.hatena.ne.jp\/t\/Java\" rel=\"tag\">Java<\/a><\/div>\n<div class='wp_social_bookmarking_light'>\n            <div class=\"wsbl_hatena\"><a href='\/\/b.hatena.ne.jp\/add?mode=confirm&url=http%3A%2F%2Fyucchi.jp%2Fblog%2F%3Fp%3D1885&title=CompletableFuture%20%E3%81%A7%E9%81%8A%E3%81%B6' title='\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0' rel=nofollow class='wp_social_bookmarking_light_a' target=_blank><img src='http:\/\/yucchi.jp\/blog\/wp-content\/plugins\/wp-social-bookmarking-light\/public\/images\/hatena.gif' alt='\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0' title='\u3053\u306e\u30a8\u30f3\u30c8\u30ea\u30fc\u3092\u306f\u3066\u306a\u30d6\u30c3\u30af\u30de\u30fc\u30af\u306b\u8ffd\u52a0' width='16' height='12' class='wp_social_bookmarking_light_img' \/><\/a><\/div>\n            <div class=\"wsbl_facebook\"><a href='http:\/\/www.facebook.com\/share.php?u=http%3A%2F%2Fyucchi.jp%2Fblog%2F%3Fp%3D1885&t=CompletableFuture%20%E3%81%A7%E9%81%8A%E3%81%B6' title='Facebook \u306b\u30b7\u30a7\u30a2' rel=nofollow class='wp_social_bookmarking_light_a' target=_blank><img src='http:\/\/yucchi.jp\/blog\/wp-content\/plugins\/wp-social-bookmarking-light\/public\/images\/facebook.png' alt='Facebook \u306b\u30b7\u30a7\u30a2' title='Facebook \u306b\u30b7\u30a7\u30a2' width='16' height='16' class='wp_social_bookmarking_light_img' \/><\/a><\/div>\n            <div class=\"wsbl_google_plus_one\"><g:plusone size=\"medium\" annotation=\"none\" href=\"http:\/\/yucchi.jp\/blog\/?p=1885\" ><\/g:plusone><\/div>\n            <div class=\"wsbl_twitter\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"http:\/\/yucchi.jp\/blog\/?p=1885\" data-text=\"CompletableFuture \u3067\u904a\u3076\" data-lang=\"ja\">Tweet<\/a><\/div>\n    <\/div>\n<br class='wp_social_bookmarking_light_clear' \/>\n","protected":false},"excerpt":{"rendered":"<p>\u3042\u3051\u307e\u3057\u3066\u304a\u3081\u3067\u3068\u3046\u3054\u3056\u3044\u307e\u3059\uff01 \u305a\u3044\u3076\u3093\u9045\u3044\u65b0\u5e74\u306e\u6328\u62f6\u3068\u306a\u308a\u307e\u3059\u304c\u672c\u5e74\u3082\u3088\u308d\u3057\u304f\u304a\u9858\u3044\u3057\u307e\u3059\u3002 \u305d\u308c\u3067\u306f\u65b0\u5e74\uff11\u767a\u76ee\u306e\u30cd\u30bf\u306f\u79c1\u306e\u611b\u3059\u308b Java \u3067\u3059\uff01 Java 8 \u306e\u65b0\u6a5f\u80fd\u3067\u3042\u308b CompletableFuture \u306e\u8a73\u7d30\u304c\u4e0b\u8a18\u30b5\u30a4\u30c8\u3067\u89e3\u8aac\u3055\u308c\u306f\u3058\u3081\u307e\u3057\u305f\u3002 \u8a73\u89e3 Java SE 8 \u7b2c19\u56de Concurrency Utilities\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8 \u305d\u306e1 Java 8 \u304c\u6b63\u5f0f\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u308b\u524d\u304b\u3089\u6c17\u306b\u306f\u306a\u3063\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u6d77\u5916\u306e\u30b5\u30a4\u30c8\u3067\u3082\u60c5\u5831\u91cf\u304c\u5c11\u306a\u304f\u82f1\u8a9e\u304c\u3088\u304f\u89e3\u3089\u306a\u3044\u306e\u3067\u6b63\u3057\u3044\u4f7f\u3044\u65b9\u304c\u89e3\u3089\u305a\u306b\u3044\u307e\u3057\u305f\u3002 \u304a\u307e\u3051\u306b Java API \u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3082\u305d\u306e\u5f53\u6642\u306f\u65e5\u672c\u8a9e\u306e\u3082\u306e\u306f\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[17],"class_list":["post-1885","post","type-post","status-publish","format-standard","hentry","category-java","tag-java"],"_links":{"self":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1885","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1885"}],"version-history":[{"count":3,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1885\/revisions"}],"predecessor-version":[{"id":1889,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1885\/revisions\/1889"}],"wp:attachment":[{"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1885"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/yucchi.jp\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}