以åãããããè¨äºãæ¸ãã¾ããã
åã¯ãä¸éçã«ãã¾ãç¥ããã¦ããªã人éãªã®ã§ããã®è¨äºããã¾ãä¼ãã£ã¦ããªãã£ãã®ã§ããããã¡ãã£ã¨æãã¦ãããã¨ãããã¾ããã
JJUG CCC 2015 Springã®ã»ãã·ã§ã³F2ã§ããã®ãããªçºè¡¨ãããã¾ããã
ããã®33ãã¼ã¸ã®ã³ã¼ãã«ã¯ãªã½ã¼ã¹è§£æ¾æ¼ããããã¾ãã
FIles.lines(path).lines().forEach(System.out::println);
ãã®ãã°ã®å¯è½æ§ã®ããã³ã¼ããJJUG CCCã¨ããããªãè¦æ¨¡ã®å¤§ãããªã£ã¦ãã大èå°ã§ãµã³ãã«ã³ã¼ãã¨ãã¦ç´¹ä»ããã¦ãã¾ãã¾ãããè¦æ¨¡ã®å¤§ããã¤ãã³ãã§ã®èª¤ã£ãäºä¾ã®ç´¹ä»ãå¾ã ã§ååãããã¦ããã®ã¯ããªãé¢åãªä½æ¥ã§ãããªã®ã§ãã§ããã ãæ©ã誤ããææãããã¨æããæ¥ãã§ãã®è¨äºãæ¹å®ã¾ãã
ã2015/04/13 7:59 追è¨ã ä¸å¿39ãã¼ã¸ã«æ¬¡ã®ããã«æ¸ããã¦ãã¾ããããã¯åã®è¦è½ã¨ãã§ããã
Stream
ã¯AutoClosable
ãå®è£ ãã¦ããããtry-with-resourcesæã®ãªã½ã¼ã¹ã¨ãã¦å©ç¨å¯è½
ãã¦ãä»¶ã®Files#lines(Path)
ã¨ããã¡ã½ããã§ãããæ¬¡ã®ãããªå®è£
ã«ãªã£ã¦ãã¾ãã
public static Stream<String> lines(Path path, Charset cs) throws IOException { BufferedReader br = Files.newBufferedReader(path, cs); try { return br.lines().onClose(asUncheckedRunnable(br)); } catch (Error|RuntimeException e) { try { br.close(); } catch (IOException ex) { try { e.addSuppressed(ex); } catch (Throwable ignore) {} } throw e; } }
ããã¯BufferedReader#lines()
ãå¼ã³åºãã¦ãStream<String>
ãåå¾ãã¦ãè¿ãã¡ã½ããã«ãªã£ã¦ãã¾ãããã®éã«ãonClose
ã«ã¦asUncheckedRunnable(BufferedReader)
ãå¼ã³åºããã¦ãããæ¬¡ã®ããã«å®è£
ããã¦ãã¾ãã
private static Runnable asUncheckedRunnable(Closeable c) { return () -> { try { c.close(); } catch (IOException e) { throw new UncheckedIOException(e); } }; }
ã¤ã¾ããonClose
ã§æå®ãããRunnable
ã§ã¯BufferedReader#close
ãå¼ã°ããããã«ãªã£ã¦ãã¾ãããã®onClosed
ã§æ¸¡ãããRunnable
ãè©ä¾¡ã»å®è¡ãããã®ã¯Stream.close
ãå®è¡ãããã¿ã¤ãã³ã°ã§ãã
ãã ãããããStream<T>
ã®çµç«¯å¦çã§ã¯close
ãå¼ã°ãããã¨ã¯ããã¾ããã
å®éã«close
ãå¼ã°ãã¦ããªããã¨ã確ãããããã«ãBufferedReader#lines()
ã¡ã½ããã®é¨åãæµç¨ããæ¬¡ã®ãããªãã¹ãã³ã¼ããæ¸ãã¦ã¿ã¾ããã
private final List<String> list = Arrays.asList("a", "b", "c", "d"); private static class OnClose implements Runnable { private boolean called = false; @Override public void run() { called = true; } public boolean isCalled() { return called; } } private Stream<String> getStream(final OnClose onClose) { // BufferedReaderã®linesã®å®è£ ã®çä¼¼ Stream<String> stream = StreamSupport.stream( Spliterators.spliteratorUnknownSize( list.iterator(), Spliterator.ORDERED | Spliterator.NONNULL), false); stream.onClose(onClose); return stream; } // try-with-resourcesãç¨ããªãã³ã¼ãã§closeãå¼ã³åºãããªããã¨ã確èªãããã¹ã @Test public void withoutTryWithResources() { OnClose onClose = new OnClose(); Stream<String> stream = getStream(onClose); stream.forEach(System.out::print); // false ãªã closeã¡ã½ãããå¼ã°ãã¦ããªã assertThat(onClose.isCalled(), is(false)); } // try-with-resourcesãç¨ããã³ã¼ãã§ã¯closeãå¼ã³åºããããã¨ã確èªãããã¹ã @Test public void withTryWithResources() { OnClose onClose = new OnClose(); try(Stream<String> stream = getStream(onClose)) { stream.forEach(System.out::print); } // closedãå¼ã³åºãã¦ããã° trueã«ãªãã assertThat(onClose.isCalled(), is(true)); }
ãã¦ããã®ãã¹ããå®è¡ããã¨ãäºã¤ã®ãã¹ãã¯ãã¹ãã¾ãã
ãããæå³ãã¦ãããã¨ã¯ãçµç«¯å¦çãå®è¡ããã ãã§ã¯close
ã¡ã½ãããå¼ã°ããªãã¨ãããã¨ã§ãã
ãã®ããããµã³ãã«ã¨ãã¦æç¤ºããã¦ããä¸è¨ã®ã³ã¼ãã«ããã¦ã¯
Files.lines(Path).forEach(System.out::println);
br.lines().onClose(asUncheckedRunnable(br))
ã§æå®ãããasUncheckedRunnable
ã§è¿ãããRunnable
ã®å¦çã¯å®è¡ããã¾ããã
ã¤ã¾ãããã¡ã¤ã«ãªã½ã¼ã¹ã®è§£æ¾ãããçºçãã¾ãã
ããã§ãããã«
ãã¡ã¤ã«èªã¿æ¸ãç³»ã®ãããå¦çã«ããã¦æ¥µãã¦æå¹
ã¨è¨è¿°ããã¦ããããããããã大éã®ãã¡ã¤ã«ã®ãã¡ã¤ã«ãªã½ã¼ã¹ã®è§£æ¾æ¼ããããã®ã§ã¯ãªããã¨èãããã¾ãã
Stream
ãAutoClosable
ãå®è£
ãã¦ãããã¨ã«ã¤ãã¦ã¯ãJavaããã°ã©ãã¼ãªãç¿å¾ãã¦ãããã Java SE 8 å®è·µããã°ã©ãã³ã°ã§ãææããã¦ãããã¨ã§ããã¾ãããã®æ¸ç±ã§ãFiles#lines(Path)
ã¯try-with-reosurcesã§åãåããã¨ã¨ããã¦ããã®ã§ã便å©ã ããã¨ãã£ã¦ãªã½ã¼ã¹ã®è§£æ¾ããã¨ããè½ã¨ãç©´ããããã¨ã«ã¯æ°ãã¤ããªãã¨ããã¾ããã
以ä¸ãå®¶ã§ç²¾ç¥ã®å®å®ãæ¬ ãã¦ãJJUG CCCã«è¡ããªãã£ãåãå¾åºãã¸ã£ã³ã±ã³ã§è¨ãã®ãã¯ã°ããããæ°ãããªãããªãã§ãããå¾ã ã®äººãã¯ã¾ããªãããã«(楽天ã¯ã©ãã ãç¥ãã)ãããã ãã¯ã¡ããã¨è¨ã£ã¦ããããã£ãã
宣ä¼
ä»ãåã¯ãã¤ç (å£ç¯æ§ãå«ã/é害è 2ç´)ã大人ã®çºéé害(åªå é ä½ã夿ã§ããªããªã©ãã¸ãã¹ä¸åºæ¬çãªã¹ãã«ãæ¬ ãã)ã§ãããªã¼ã§ãä»äºãæããç¶ãã¦ã¦ãçµæ¸çã«å°çª®ãã¦ãã¾ããéã£ã¦ããã伿¥ãã(éå®³è æ )ããããã¯é±15æéç¨åº¦ã§ãä»äºãããã人(æçµ¦æç®3,000å以ä¸)ãåéãã¦ãã¾ããããéã£ã¦ãããããä»äºããããã£ã¦æ¹ããããã¾ãããããé£çµ¡ãããã ããã¨å¤§å¤ãããããã§ãã
ãè¿½è¨ 2015/04/12 22:24ã
ãã¤ã¼ããã©ã£ã¦ããããããªããã£ãã
å¤åãçºè¡¨è ã®æ¹ã ã¨æãã
ãããã¨ããã¯try-with-resourceã§å²ããã¨ã¯è¨ããããã¨ã®æ¬è³ªãããªãããããã¨çãã¦ããã ãã©â¦ 39Pãããã§ã¡ããã¨æ¸ãã¦ãããªï½
æ®éã«èãããçãããã¨ãããåããããã ãã©ãªã
ããããããã大éã®ãã¡ã¤ã«ã®ãã¡ã¤ã«ãªã½ã¼ã¹ã®è§£æ¾æ¼ããããã®ã§ã¯ãªããã¨èãããã¾ããã£ã¦æã«ã¯ãããã«ã¡ãã£ã¨å¾¡ç¤¾ã®æè¡åèããããããã¨æã£ã
ãããã«Fileéãã¦Closeããªãã¯ç´ 人ãããï½ ã¾ãããã£ã¦ãã¨ã ãã£ã¨ãã¬ãã£ããªã¢ã¬ããããã¨æã£ã¦ãã
åã¯ä¼å ´ã«ããªãã£ãã®ã§ããã®èª¬æããã£ãã®ãã©ããããããã®ã ãã©ãæ¬è³ªçã§ãªãã¨ããã¯ç«¯æã£ãããã¡ããã¨è¡éèªãã§ãã§çµããããã®ã§ã¯ãªããã¡ããã¨ãç®ç«ããªããã©39Pã«æ¸ãã¦ããã¾ã( ï½°`дー´)ï½·ï¾ï½¯ãã¨ææãã¦æ¬²ããã£ããããµã«ãªã«å¯¾ããèæ§ã¯åã«ã¯ãªããã©ãå 輪ã ãã§ãå¾¡ç¤¾ã®æè¡ãªããããããã¤ï½ï½ï½ãã¨ãè¨ã£ã¦ãªãã§ã¡ããã¨åã®ãã¹ãªã¼ãã£ã³ã°ã«å¯¾ãã¦ããµã«ãªæãã¦ãã³ãã¥ããã£å ¨ä½ã«æ å ±ãçºä¿¡ãã¦ã»ãããã®ã§ããçºè¡¨è ã@mike_neck ããã39Pã«æ¸ãã¨ãããªãå¼ç¤¾ã®æè¡ãªãããªãï¼ãâåããããããã¯æ°ã¥ãã¾ããã§ãããã§ã¯ããã®ããã°ã§ã¡ããã¨èª¬æãã¦ããã¾ããããã£ã¦ããæµãã§ãå ¬éãã¦ããæ å ±ãããå¼·åãããæ©ä¼ãçã¾ããã¯ãã ã£ãããã§ãããã
ã2015/04/13 8:11ã ãã¤ãã¿ã¼å¢ç¹å®ããã®ã¯è¯ããªãã®ã§ãå¢ã®æ å ±åãé¤ãã