Java8è¶ å ¥é - foræã®ä»£ããã«Streamã使ãã(1)
ä»å¹´ã®3æã«ãªãªã¼ã¹ãããJava8ã§ã¯ã颿°åã¤ã³ã¿ã¼ãã§ã¼ã¹ãã©ã ãå¼ãStream
ãOptional
ãªã©ã颿°åè¨èªã®ä»çµã¿ãå°å
¥ãããã
ãã®ããã°ã§ããããã¾ã§Java8の新機能の解説記事ãããããæ¸ãã¦ããããå
·ä½çã«ã©ããªå ´é¢ã§ä½¿ãã°ããã®ã ãããã¨ç´ æ´ã«çåãæãã¦ãã人ããããããããªããããã§ãä»åããä½åãã«åãã¦ãå®éã®ããã°ã©ãã³ã°ã§ããã«ä½¿ããJava8ã®æ°æ©è½ãç´¹ä»ãã¦ããã
ã¾ãã¯Stream
ã®åºæ¬çãªä½¿ãæ¹ããå§ãããã
ã³ã¬ã¯ã·ã§ã³ãfor
æã§æä½ãã
ããã§ã¯ãã·ã³ãã«ãªPerson
ãªãã¸ã§ã¯ããä¾ã«åãä¸ããã
public class Person { private String name; private boolean maleFlag; private int age; public String getName() { return this.name; } public boolean isMale() { return this.maleFlag; } public int getAge() { return this.age; } /* ã³ã³ã¹ãã©ã¯ã¿ãsetterã¯çç¥ */ }
ãã®Person
ãªãã¸ã§ã¯ããæ ¼ç´ããã³ã¬ã¯ã·ã§ã³ã®ä¸ã«ãæªæå¹´ã®Person
ãåå¨ãããã©ããããã§ãã¯ããã³ã¼ããæ¸ãã¦ã¿ããã徿¥ã®for
æã使ã£ã¦æ¸ãã¨ã次ã®ããã«ãªãã ããã
// æªæå¹´ãåå¨ãããã©ãããå¤å®ãã public boolean existsInfant(List<Person> persons) { for (Person person : persons) { if (person.getAge() < 20) { return true; } } return false; }
ãªãã¨ãããã¨ã¯ãªããfor
ã«ã¼ãã使ã£ã¦ã³ã¬ã¯ã·ã§ã³ããPerson
ãªãã¸ã§ã¯ããåãåºããæªæå¹´ã®æ¡ä»¶ã«ä¸è´ãããã©ãããå¤å®ããã該å½ããå ´åã«ã¯ãã«ã¼ãã®éä¸ã§ãå³åº§ã«true
ããªã¿ã¼ã³ããã«ã¼ãã®æå¾ã¾ã§å°éããå ´åã¯false
ããªã¿ã¼ã³ããã ãã ã
for
æã®ãã¸ãã¯ãStream
ã§æ¸ãæãã
Java7ãªããä¸è¨ã®ã³ã¼ãã«ã¯ä½ã®åé¡ããªãã
ãããJava8ã使ããªãããã®ã³ã¼ãã¯ãã£ã¨ã·ã³ãã«ã«æ¸ãããStream
ã使ãã°ã以ä¸ã«ç¤ºãããã«ãã¸ãã¯ã®æ¬ä½ã1ã¹ãã¼ãã¡ã³ãã§è¨è¿°ã§ããã
public boolean existsInfant2(List<Person> persons) { return persons.stream() .anyMatch(p -> p.getAge() < 20); }
ç°¡åã«è§£èª¬ãããã
2è¡ç®ã§ã¯ãã³ã¬ã¯ã·ã§ã³ã®persons
ã«å¯¾ãã¦stream()
ã¡ã½ãããå¼ã³åºããã¨ã§ãStream
ãªãã¸ã§ã¯ããçæãã¦ããã
Stream
ã¯ãJava8ãæä¾ããéåãã¼ã¿ã ãJava8ã§ã¯ãæ¢åã®ã³ã¬ã¯ã·ã§ã³ï¼List
ãSet
ãªã©ï¼ã¨ã¯å¥ã«ã颿°åããã°ã©ãã³ã°ããµãã¼ãããéåãã¼ã¿ãæ°ãã«æä¾ãã¦ãããStream
ãããã«ç¸å½ããã
3è¡ç®ã§ã¯ãåãåºããStream
ãªãã¸ã§ã¯ãã«å¯¾ãã¦ãç¶ãã¦anyMatch
ã¡ã½ãããå¼ã³åºããã¨ã§ãPerson
ãã¼ã¿éåã®ä¸ã«è©²å½ããæ¡ä»¶ï¼ï¼ããã§ã¯æªæå¹´ãã©ããï¼ã®è¦ç´ ãåå¨ãããã©ãããå¤å®ãã¦ããã
anyMatch
ã¯ãStream
ã«æ ¼ç´ãããè¦ç´ ã®ããããï¼=anyï¼ããæå®ãããæ¡ä»¶ã«è©²å½ããï¼=matchï¼ãã©ãããå¤å®ããã¡ã½ããã ã
ã¡ãªã¿ã«ããã®ããã«æ»ãå¤ã¤ãã®ã¡ã½ãããè¤æ°é£ç¶ãã¦å¼ã³åºããã¨ãããã¡ã½ãããã§ã¼ã³ãï¼Method Chainingï¼ã¨å¼ã¶ã
ã©ã ãå¼ã§éåãã¼ã¿ã«å¯¾ããå¦çå 容ãè¨è¿°ãã
anyMatch
ã¡ã½ããã®å¼æ°ã«æå®ãã¦ããã®ãã©ã ãå¼ã ãã©ã ãå¼ã®é¨åãåãåºãã¨æ¬¡ã®ããã«ãªã£ã¦ããã
p -> p.getAge() < 20
Java7以åã«æ
£ã親ããã ããã°ã©ãã¼ã«ã¨ã£ã¦ããã®ã³ã¼ãã¯åã£ã¤ãã¥ãããããããªããä½ãåæç¥èããªããã°ãå宣è¨ããªãåçªã«åºã¦ããp
夿°ãã->
è¨å·ãªã©ã¯æå³ä¸æã«è¦ãããã¨ã ããã
ä¸ã®ã©ã ãå¼ãããå°ãä¸å¯§ã«æ¸ãã¨æ¬¡ã®ããã«ãªãã
(Person person) -> (person.getAge() < 20)
ããã§ã¯3ã¤ã®å¤æ´ãæ½ããã
1ã¤ãã¯->
è¨å·ã®å·¦å³ã®è¨è¿°ãããããæ¬å¼§ã§ããã£ããã¨ã§ãããããã«ãã->
è¨å·ãå¢ã«ãã¦ã左辺ã¨å³è¾ºã«åé¢ã§ãããã¨ãæç¤ºããã左辺ã¯å¼æ°ã®å®£è¨ã§ãå³è¾ºã¯ãã®å¼æ°ã使ã£ãå®éã®å¦çã表ãã¦ããã
2ã¤ãã®å¤æ´ç¹ã¯ãå
ã»ã©ã¯p
ã ã£ã夿°åãperson
ã«å¤ãããã¨ã§ããããããããã¨ã§ãããã§å¦ç対象ã«ãã¦ããã®ãPerson
ãªãã¸ã§ã¯ãã§ãããã¨ãæç¤ºãããå®éã«ã¯å¤æ°åã¯ä½ã§ããã¾ããªãããä¸è¬çã«ã©ã ãå¼ã®å
é¨ã§ã¯ãæååãªãs
ãæ´æ°ãªãi
ã®ããã«çã夿°åã使ãã®ãä¸è¬çã§ããããã®ãããå
ã»ã©ã®ã³ã¼ãã§ã¯å¤æ°åãp
ã¨ããã
3ã¤ãã¯ãperson
夿°ãPerson
åã§ãããã¨ãæç¤ºãããã¨ã§ãããanyMatch
ã¡ã½ããã¯ããããå¼ã°ããæç¹ã§Stream
ã«æ ¼ç´ããã¦ããè¦ç´ ãå¦ç対象ã«ããç´æã«ãªã£ã¦ããããã®ä¾ã§ã¯anyMatch
ãå¼ã°ããæç¹ã®Stream
ã«ã¯Person
ãªãã¸ã§ã¯ããæ ¼ç´ããã¦ããããã夿°ã®åãæç¤ºããå¿
è¦ããªãã
ã¡ãªã¿ã«ããã®ããã«åãæç¤ºçã«å®£è¨ããªãã¦ããã³ã³ãã¤ã©ãå®è¡ç°å¢ãåãç¹å®ãã¦ãããä»çµã¿ãã忍è«ãï¼type inferenceï¼ã¨å¼ã¶ã
ãã¦ãæ¹ãã¦2ã¤ã®ã©ã ãå¼ãçºãã¦è¦ã¦æ¬²ããã
ããã¾ã§ã®è§£èª¬ã§ããããã®ã©ã ãå¼ããanyMatch
ã¡ã½ããã®æ¡ä»¶ã¨ãã¦ããPerson
ãªãã¸ã§ã¯ãã«å¯¾ãã¦ãperson.getAge() < 20
ãæãç«ã¤ãã©ããããæå®ãã¦ãããã¨ãèªã¿åããã®ã§ã¯ãªãã ãããã
ã©ã ãå¼ã§é¢æ°åã¤ã³ã¿ã¼ãã§ã¼ã¹ã®ãã¸ãã¯ããã®å ´ã§å®ç¾©ãã
ããã§ãã©ã ãå¼ããã£ããä½è ãªã®ãã説æãã¦ãããã
ã©ã ãå¼ã¯ã颿°åè¨èªï¼ããã³æ°å¦ï¼ã®ç¨èªã§ãç¡å颿°ï¼ååãæããªã颿°ï¼ãå®ç¾©ããè¨æ³ã ã
Java8ã«ããã¦ã¯ã颿°åã¤ã³ã¿ã¼ãã§ã¼ã¹ãã«å®ç¾©ãããã¡ã½ããã®ãã¸ãã¯ããã®å ´ã§å®ç¾©ããä»çµã¿ãæãã
å
ã»ã©ã®anyMatch
ã¡ã½ããã®ã·ã°ããã£ãJavadocã§èª¿ã¹ãã¨ãPredicate
ã¨ãã颿°åã¤ã³ã¿ã¼ãã§ã¼ã¹ã弿°ã¨ãã¦åãåã£ã¦ãããã¨ããããã
颿°åã¤ã³ã¿ã¼ãã§ã¼ã¹ã¯ãJava8ããæ°ãã«æä¾ãããä»çµã¿ã§ãåºæ¬çã«ã¡ã½ãããä¸ã¤ã ãå®ç¾©ã§ããã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ãããï¼default
ã¡ã½ããã¯è¤æ°æã¦ããããã®è©±ã¯çç¥ããï¼ã
Predicate
ã¯æ¡ä»¶å¤å®ç¨ã®é¢æ°åã¤ã³ã¿ã¼ãã§ã¼ã¹ã®ãããã¡ã½ããã®æ»ãå¤ã¯boolean
ã«ãªã£ã¦ãããå
ã»ã©ã®ã³ã¼ãä¾ã§ã¯ãæªæå¹´ãã©ãããå¤å®ãããã¸ãã¯ãPredicate
ãæã¤ã¡ã½ããã®ã³ã¼ãã¨ãã¦è¨è¿°ãããã¨ã«ãªãã
颿°åã¤ã³ã¿ã¼ãã§ã¼ã¹ã¯ä¾¿å®çãªä»çµã¿
ãã®è¨äºã®åé ã§ãJava8ã颿°åè¨èªã®ä»çµã¿å°å ¥ãããã¨ãæ¸ããã
ããããä¸ã§èª¬æããã颿°åã¤ã³ã¿ã¼ãã§ã¼ã¹ãã¯ãä¸è¬çãªé¢æ°åè¨èªã«ã¯åãã£ã¦ããªããJavaåºæã®ä»çµã¿ã§ããã
颿°åè¨èªã¯ããã®åã®éãã颿°ããåºæ¬ã¨ãã¦ããã°ã©ã ãçµã¿ä¸ããã®ãåºæ¬çãªèãæ¹ã§ããã
ããããJavaã¯ãªãã¸ã§ã¯ãæåè¨èªã¨ãã¦èæ¡ãããããããªãã¸ã§ã¯ãã«å±ããªã颿°ãå®ç¾©ããä»çµã¿ãæã£ã¦ããªãã£ãã
ãããªJavaã«ããã¨ãã颿°åè¨èªã®ä»çµã¿ãåãå
¥ããããã«ããã¡ã½ããã1ã¤ã ãæã¤é¢æ°åã¤ã³ã¿ã¼ãã§ã¼ã¹ããå°å
¥ãããã¨ã§ãæ¢åã®ä»çµã¿ã大ããå¤ããã«å¯¾å¿ããçµç·¯ãããã
ãã®ãããã©ã ãå¼ãæ¸ãéã«ã¯ã颿°åã¤ã³ã¿ã¼ãã§ã¼ã¹ã®ãã¨ã¯æ·±ãèãããç´ç²ã«ããã§å¿
è¦ã¨ãªã颿°ï¼Javaã§ã¯ã¡ã½ããï¼ã®ãã¸ãã¯ãå®ç¾©ãããã®ã¨èããã°è¯ãã ããã
ããããJava8ã®è¨è¨è
ãã人ã
ããããªé¢¨ã«èãã¦ããã°ã©ãã³ã°ãããã¨ãæå¾
ãã¦ããã¯ãã§ããã
Stream
ã使ãã¨ã³ã¼ããç°¡æ½ã§èªã¿ããããªã
æå¾ã«Stream
ã使ãã¡ãªãããã¾ã¨ãã¦ãããã
ã¡ãªãããä¸è¨ã§è¨ãã°ãã³ã¼ããç°¡æ½ã«ãªããèªã¿ããããªããã¨ã ã
ä¸è¬çã«ãfor
æãããStream
ãä½¿ãæ¹ãã³ã¼ãã®è¡æ°ã¯çããªãã
ããéè¦ãªã®ã¯å¯èªæ§ã®é«ãã ã
æåã«ç¤ºããfor
æã®ã³ã¼ããæ¹ãã¦è¦ã¦ãããããããã®ã³ã¼ãã§ã¯ãã«ã¼ãã®ä¸ã§1è¦ç´ ãã¤Person
ãæªæå¹´ãã©ãããå¤å®ããè¦ã¤ãã£ãå ´åã«ã¯å³åº§ã«true
ãè¿ããæå¾ã¾ã§è¦ã¤ãããªãã£ãå ´åã«ã¯false
ãè¿ããã¨ã§æªæå¹´ã®åå¨ãã§ãã¯ãè¡ã£ã¦ããã
䏿¹ã§ãStream
ã使ã£ãã³ã¼ãã§ã¯ãanyMatch
ã¡ã½ããã®ä¸ã«ãæªæå¹´ã®æ¡ä»¶ãè¨è¿°ãã¦ããã Stream
ã«æ ¼ç´ãããè¦ç´ ã®ããããï¼=anyï¼ããã«ãã³å
ã«æ¸ããæ¡ä»¶ã«è©²å½ããï¼=matchï¼ãã©ãããå¤å®ãããã¨ãããã¸ãã¯ãç°¡æ½ã«è¨è¿°ã§ãã¦ãããã¨ãèªã¿åããã ããã
ã¾ã¨ãã¨é¢é£è¨äº
ä»åã®è¨äºã§ã¯ãfor
æã®ãã¸ãã¯ãStream
ã®anyMatch
ã¡ã½ããã使ã£ã¦æ¸ãæããä¾ãç´¹ä»ããã
Stream
ã¯ãanyMatch
ã®ä»ã«ãallMatch
ãnonMatch
ãªã©ã®é¡ä¼¼ããã¡ã½ããã«å ãã¦ãå¤æãæ½åºå¦çãéè¨ãªã©å¤ãã®æ©è½ãæä¾ãã¦ããã
ãããã®è©³ããå
容ã«é¢ãã¦ã¯ã以ä¸ã®è¨äºãåèã«ãã¦ãããããã
Java8 Stream APIの基本(1) - 代表的な中間操作
Java8 Stream APIの基本(6) - 終端操作の概要
Java8 Stream APIの基本(7) - 終端操作 2(Stream#collect)
次回ã¯Stream
ã®filter
ã¡ã½ãããç´¹ä»ããã