åç §: 説æ
| ã€ã³ã¿ãã§ãŒã¹ | 説æ |
|---|---|
| BaseStream<T,S extends BaseStream<T,S>> |
é æ¬¡ããã³äžŠåã®éçŽæäœããµããŒãããèŠçŽ ã·ãŒã±ã³ã¹ã§ããã¹ããªãŒã ã®åºåºã€ã³ã¿ãã§ãŒã¹ã
|
| Collector<T,A,R> |
å¯å€çµæã³ã³ããã«å
¥åèŠçŽ ãèç©ãããªãã·ã§ã³ã§ãã¹ãŠã®å
¥åèŠçŽ ãåŠçãããåŸã§èç©ãããçµæãæçµçãªè¡šçŸã«å€æããå¯å€ãªãã¯ã·ã§ã³æäœã
|
| DoubleStream |
é æ¬¡ããã³äžŠåã®éçŽæäœããµããŒãããããªããã£ãdoubleå€èŠçŽ ã®ã·ãŒã±ã³ã¹ã§ãã
|
| DoubleStream.Builder |
DoubleStreamã®å¯å€ãã«ããŒã§ãã |
| IntStream |
é æ¬¡ããã³äžŠåã®éçŽæäœããµããŒãããããªããã£ãintå€èŠçŽ ã®ã·ãŒã±ã³ã¹ã§ãã
|
| IntStream.Builder |
IntStreamã®å¯å€ãã«ããŒã§ãã |
| LongStream |
é æ¬¡ããã³äžŠåã®éçŽæäœããµããŒãããããªããã£ãlongå€èŠçŽ ã®ã·ãŒã±ã³ã¹ã§ãã
|
| LongStream.Builder |
LongStreamã®å¯å€ãã«ããŒã§ãã |
| Stream<T> |
é æ¬¡ããã³äžŠåã®éçŽæäœããµããŒãããèŠçŽ ã®ã·ãŒã±ã³ã¹ã§ãã
|
| Stream.Builder<T> |
Streamã®å¯å€ãã«ããŒã§ãã |
| ã¯ã©ã¹ | 説æ |
|---|---|
| Collectors |
èŠçŽ ãã³ã¬ã¯ã·ã§ã³ã«èç©ããããããŸããŸãªæ¡ä»¶ã«åŸã£ãŠèŠçŽ ãèŠçŽãããªã©ãæçšãªåçš®ãªãã¯ã·ã§ã³æäœãå®è£
ãã
Collectorå®è£
ã |
| StreamSupport |
ã¹ããªãŒã ãäœæããã³æäœããããã®äœã¬ãã«ã®ãŠãŒãã£ãªãã£ã»ã¡ãœããã§ãã
|
| åæå | 説æ |
|---|---|
| Collector.Characteristics |
ãªãã¯ã·ã§ã³å®è£
ã®æé©åã«äœ¿çšå¯èœãªã
Collectorã®ããããã£ãŒã瀺ãç¹æ§ã |
int sum = widgets.stream()
.filter(b -> b.getColor() == RED)
.mapToInt(b -> b.getWeight())
.sum();
ããã§ã¯ãCollection<Widget>ã§ããwidgetsãã¹ããªãŒã ã®ãœãŒã¹ãšããŠäœ¿çšããåŸããã®ã¹ããªãŒã ã«å¯ŸããŠãã£ã«ã¿-ããã-ãªãã¥ãŒã¹ãå®è¡ããèµ€ããŠã£ãžã§ããã®ééã®åèšãååŸããŠããŸãã (åèšã¯ãªãã¯ã·ã§ã³æäœã®äžäŸã§ãã)
ãã®ããã±ãŒãžã§å°å
¥ãããäž»ãªæœè±¡ã¯ãã¹ããªãŒã ã§ãã ã¯ã©ã¹StreamãIntStreamãLongStreamããã³DoubleStreamã¯ããªããžã§ã¯ãããã³ããªããã£ãåintãlongããã³doubleã«å¯Ÿããã¹ããªãŒã ã§ãã ã¹ããªãŒã ã¯ããã€ãã®ç¹ã§ã³ã¬ã¯ã·ã§ã³ãšç°ãªããŸãã
Streamããã£ã«ã¿ãªã³ã°ãããšããœãŒã¹ã§ããã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ãåé€ãããã®ã§ã¯ãªãããã£ã«ã¿ãªã³ã°ãããèŠçŽ ãå«ãŸãªãæ°ããStreamãçæãããŸãã Stringãæ¢ãå Žåããã¹ãŠã®å
¥åæååãæ€æ»ããå¿
èŠã¯ãããŸããã ã¹ããªãŒã æäœã¯äžéæäœ(Streamãçæããæäœ)ãšçµç«¯æäœ(å€ãŸãã¯å¯äœçšãçæããæäœ)ã«åããããŸãã äžéæäœã¯åžžã«é
å»¶çã§ãã limit(n)ãfindFirst()ãªã©ã®ç絡æäœã䜿ãã°ãç¡éã¹ããªãŒã ã«å¯Ÿããèšç®ãæéã®æéã§çµããããããšãã§ããŸãã Iteratorãšåæ§ããœãŒã¹ã®åãèŠçŽ ãå床䜿çšããã«ã¯ãæ°ããã¹ããªãŒã ãçæããå¿
èŠããããŸãã
Collectionãã(stream()ããã³parallelStream()ã¡ãœããçµç±)ãArrays.stream(Object[])çµç±)ãStream.of(Object[])ãIntStream.range(int, int)ãStream.iterate(Object, UnaryOperator)ãªã©)ãããBufferedReader.lines()ãããã¡ã€ã«ã®è¡ãååŸã§ããŸããFilesã®ã¡ãœãããããã¡ã€ã«ã»ãã¹ã®ã¹ããªãŒã ãååŸã§ããŸããRandom.ints()ããä¹±æ°ã®ã¹ããªãŒã ãååŸã§ããŸããBitSet.stream()ãPattern.splitAsStream(java.lang.CharSequence)ãJarFile.stream()ãªã©)ããµãŒãããŒãã£ãŒã»ã©ã€ãã©ãªã¯ããããã®ãã¯ããã¯ã䜿ã£ãŠè¿œå ã®ã¹ããªãŒã ã»ãœãŒã¹ãæäŸã§ããŸãã
ã¹ããªãŒã æäœã¯äžéæäœãšçµç«¯æäœã«åãããŸãããããããçµã¿åãããŠã¹ããªãŒã ã»ãã€ãã©ã€ã³ã圢æãããŸãã ã¹ããªãŒã ã»ãã€ãã©ã€ã³ã¯ã1ã€ã®ãœãŒã¹(Collectionãé
åããžã§ãã¬ãŒã¿é¢æ°ãå
¥åºåãã£ãã«ãªã©)ãããã«ç¶ã0å以äžã®äžéæäœ(Stream.filterãStream.mapãªã©)ããã³1ã€ã®çµç«¯æäœ(Stream.forEachãStream.reduceãªã©)ããæ§æãããŸãã
äžéæäœã¯æ°ããã¹ããªãŒã ãè¿ããŸãã ãããã®æäœã¯åžžã«é
å»¶ãããŸããfilter()ãªã©ã®äžéæäœãå®è¡ããŠããå®éã®ãã£ã«ã¿ãªã³ã°ã¯äžåå®è¡ãããã代ããã«ããã©ããŒã¹æã«æåã®ã¹ããªãŒã ã®èŠçŽ ã®ãã¡æå®ãããè¿°èªã«äžèŽãããã®ãæ ŒçŽãããæ°ããã¹ããªãŒã ãäœæãããŸãã ãã€ãã©ã€ã³ã®çµç«¯æäœãå®è¡ããããŸã§ããã€ãã©ã€ã³ã»ãœãŒã¹ã®ãã©ããŒãµã«ã¯éå§ãããŸããã
Stream.forEachãIntStream.sumãªã©ã®çµç«¯æäœã¯ãã¹ããªãŒã ããã©ããŒã¹ããŠçµæãå¯äœçšãçæã§ããŸãã çµç«¯æäœã®å®è¡ãå®äºãããšãã®ã¹ããªãŒã ã»ãã€ãã©ã€ã³ã¯æ¶è²»æžãšã¿ãªããã以é䜿çšã§ããªããªããŸããåãããŒã¿ã»ãœãŒã¹ãå床ãã©ããŒã¹ããå¿
èŠãçããå Žåã¯ãããŒã¿ã»ãœãŒã¹ã«æ»ã£ãŠæ°ããã¹ããªãŒã ãååŸããå¿
èŠããããŸãã çµç«¯æäœã¯ã»ãšãã©ãã¹ãŠã®å Žåã«ç©æ¥µçã§ãããããŒã¿ã»ãœãŒã¹ã®ãã©ããŒãµã«ããã€ãã©ã€ã³ã®åŠçãå®äºãããåŸã§ãªã¿ãŒã³ããŸãã ããã§ãªãçµç«¯æäœã¯iterator()ãšspliterator()ã ãã§ãããããã¯ãæ¢åã®æäœã§ã¯äžååã§ã¿ã¹ã¯ãå®è¡ã§ããªãå Žåã«ä»»æã®ã¯ã©ã€ã¢ã³ãå¶åŸ¡ãã€ãã©ã€ã³ã»ãã©ããŒãµã«ãè¡ããããã«ããããã®ããšã¹ã±ãŒãã»ãããããšããŠæäŸãããŠããŸãã
ã¹ããªãŒã ã®é å»¶åŠçã¯å¹çæ§ãå€§å¹ ã«åäžãããŸããäžèšã®ãã£ã«ã¿-ããã-åèšã®äŸã®ãããªãã€ãã©ã€ã³ã§ã¯ããã£ã«ã¿ãªã³ã°ããããã³ã°ããã³åèšãããŒã¿ã«å¯Ÿããåäžãã¹ã«èåããããšãã§ããäžéç¶æ ãæå°éã«æããããŸãã é å»¶åŠçã§ã¯ãå šããŒã¿ã®æ€æ»ãäžèŠã§ããã°ãããåé¿ããããšãå¯èœãšãªããŸããã1000æåãè¶ ããé·ãã®æåã®æååãèŠã€ããããšãã£ãæäœã§ã¯ãå¿ èŠãªç¹æ§ãåããæååãèŠã€ããã®ã«ååãªæ°ã®æååãæ€æ»ããã ãã§æžã¿ããœãŒã¹ããååŸå¯èœãªãã¹ãŠã®æååãæ€æ»ããå¿ èŠããªããªããŸãã (ãã®åäœã¯ãå ¥åã¹ããªãŒã ããã 倧ããã ãã§ãªãç¡éã§ããå Žåã«ããã«éèŠãšãªããŸãã)
äžéæäœã¯ããã«ã¹ããŒãã¬ã¹æäœãšã¹ããŒããã«æäœã«åããããŸãã ã¹ããŒãã¬ã¹æäœ(filterãmapãªã©)ã¯ãæ°ããèŠçŽ ãåŠçããéã«ã以åã«åç
§ããèŠçŽ ã®ç¶æ
ãä¿æããŸãããåèŠçŽ ã®åŠçã¯ãä»ã®èŠçŽ ã®æäœãšã¯ç¡é¢ä¿ã«å®è¡ã§ããŸãã ã¹ããŒããã«æäœ(distinctãsortedãªã©)ã¯ãæ°ããèŠçŽ ãåŠçããéã«ã以åã«åç
§ããèŠçŽ ã®ç¶æ
ãçµã¿èŸŒãå¯èœæ§ããããŸãã
ã¹ããŒããã«æäœã¯ãå ¥åã®å šäœãåŠçããªããšçµæãçæã§ããªãå¯èœæ§ããããŸãã ããšãã°ã¹ããªãŒã ããœãŒãããå Žåãã¹ããªãŒã ã®ãã¹ãŠã®èŠçŽ ãåŠçããããŸã§ãçµæãçæããããšãã§ããŸããã ãã®ããã䞊åèšç®äžã§ã¯ãã¹ããŒããã«ãªäžéæäœãå«ãäžéšã®ãã€ãã©ã€ã³ã§ãããŒã¿ã«å¯Ÿãããã¹ãè€æ°å¿ èŠã«ãªã£ããã倧éã®ããŒã¿ããããã¡ãŒã«æ ŒçŽããå¿ èŠãçãããããå¯èœæ§ããããŸãã ã¹ããŒãã¬ã¹ãªäžéæäœã®ã¿ãå«ããã€ãã©ã€ã³ã¯ãé æ¬¡ã䞊åã®ãããã§ãã£ãŠããæå°éã®ããŒã¿ã»ãããã¡ãªã³ã°ã§åäžãã¹ã§åŠçã§ããŸãã
ããã«ãäžéšã®æäœã¯ç絡æäœãšã¿ãªãããŸãã äžéæäœãç¡éã®å ¥åãäžãããããšãã«æéã®ã¹ããªãŒã ãçµæãšããŠçæããå¯èœæ§ãããå Žåããã®æäœã¯ç絡æäœã«ãªããŸãã çµç«¯æäœãç¡éã®å ¥åãäžãããããšãã«æéã®æéã§çµäºããå¯èœæ§ãããå Žåããã®æäœã¯ç絡æäœã«ãªããŸãã ç絡æäœããã€ãã©ã€ã³ã«å«ããããšã¯ãç¡éã¹ããªãŒã ã®åŠçãæéæéã§æ£åžžçµäºããããã®å¿ èŠæ¡ä»¶ã§ã¯ãããŸãããå忡件ã§ã¯ãããŸããã
æç€ºçãªfor-ã«ãŒãã§èŠçŽ ãåŠçããæäœã¯ãæ¬è³ªçã«é 次çã§ãã ã¹ããªãŒã ã§ã¯äžŠåå®è¡ãããããããã«ãèšç®ããåã
ã®èŠçŽ ããšã®åœä»€åæäœãšããŠã§ã¯ãªããéçŽæäœã®ãã€ãã©ã€ã³ãšããŠåæ§æãããŸãã ãã¹ãŠã®ã¹ããªãŒã æäœã¯é 次ã䞊åã®ã©ã¡ãã§ãå®è¡ã§ããŸãã JDKã®ã¹ããªãŒã å®è£
ã¯ãäžŠåæ§ãæç€ºçã«èŠæ±ãããªãéããé æ¬¡ã¹ããªãŒã ãäœæããŸãã ããšãã°ãCollectionã«å«ãŸããã¡ãœããCollection.stream()ãCollection.parallelStream()ã¯ããããé æ¬¡ã¹ããªãŒã ã䞊åã¹ããªãŒã ãçæããŸããIntStream.range(int, int)ãªã©ã®ãã®ä»ã®ã¹ããªãŒã çæã¡ãœããã§ã¯é 次ã¹ããªãŒã ãçæãããŸããããããã®ã¹ããªãŒã ã¯ãBaseStream.parallel()ã¡ãœãããåŒã³åºãããšã§å¹ççã«äžŠååããããšãã§ããŸãã åè¿°ã®ããŠã£ãžã§ããã®éãã®åèšãã¯ãšãªãŒã䞊åã§å®è¡ããã«ã¯ã次ã®ããã«ããŸãã
int sumOfWeights = widgets.parallelStream().filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum();
ãã®äŸã®é 次çãšäžŠåçã®éãã¯ãåæã¹ããªãŒã ã®äœææã«ãstream()ãã§ã¯ãªããparallelStream()ãã䜿çšããç¹ã ãã§ãã çµç«¯æäœã®èµ·åæã«ã¹ããªãŒã ã»ãã€ãã©ã€ã³ãé æ¬¡ã䞊åã®ã©ã¡ãã§å®è¡ããããã¯ãåŒåºã察象ã§ããã¹ããªãŒã ã®ç¹æ§ã«ãã£ãŠæ±ºãŸããŸãã ã¹ããªãŒã ãé æ¬¡ã䞊åã®ã©ã¡ãã§å®è¡ãããããå€å®ããã«ã¯isParallel()ã¡ãœããã䜿çšããã¹ããªãŒã ã®ç¹æ§ã倿Žããã«ã¯BaseStream.sequential()ããã³BaseStream.parallel()æäœã䜿çšããŸãã çµç«¯æäœã®èµ·åæã«ã¹ããªãŒã ã»ãã€ãã©ã€ã³ãé æ¬¡ã䞊åã®ã©ã¡ãã§å®è¡ããããã¯ãåŒåºã察象ã§ããã¹ããªãŒã ã®ã¢ãŒãã«ãã£ãŠæ±ºãŸããŸãã
findAny()ã®ãããªæç€ºçã«é決å®è«çãšããŠèå¥ãããŠããæäœãé€ããã¹ããªãŒã ãé æ¬¡ã䞊åã®ã©ã¡ãã§å®è¡ããããã«ãã£ãŠèšç®çµæãå€ããã¹ãã§ã¯ãããŸããã
ã»ãšãã©ã®ã¹ããªãŒã æäœã¯ãŠãŒã¶ãŒæå®ã®åäœãèšè¿°ãããã©ã¡ãŒã¿ãåãåããŸããããã®ãã©ã¡ãŒã¿ã¯éåžžãã©ã ãåŒã«ãªããŸãã æ£ããåäœãç¶æããã«ã¯ããããã®åäœãã©ã¡ãŒã¿ãéå¹²æžçã§ããããã€ã»ãšãã©ã®å Žåã¹ããŒãã¬ã¹ã§ãªããã°ãããŸããã ãã®ãããªãã©ã¡ãŒã¿ã¯åžžã«é¢æ°åã€ã³ã¿ãã§ãŒã¹(Functionãªã©)ã®ã€ã³ã¹ã¿ã³ã¹ã§ãããéåžžã¯ã©ã ãåŒãã¡ãœããåç
§ã«ãªããŸãã
ArrayListãªã©ã®ã¹ã¬ããã»ãŒãã§ãªãã³ã¬ã¯ã·ã§ã³ãå«ããããŸããŸãªããŒã¿ã»ãœãŒã¹ã«å¯ŸããŠäžŠåã®å¯èœæ§ãããéçŽæäœãå®è¡ã§ããŸãã ãããå¯èœã«ãªãã®ã¯ãã¹ããªãŒã ã»ãã€ãã©ã€ã³ã®å®è¡æã«ããŒã¿ã»ãœãŒã¹ãžã®å¹²æžãé²ããå Žåã ãã§ãã ãšã¹ã±ãŒããããæäœã®iterator()ãšspliterator()ãé€ããå®è¡ã¯çµç«¯æäœãåŒã³åºãããæç¹ã§å§ãŸããçµç«¯æäœãå®äºããæç¹ã§çµãããŸãã ã»ãšãã©ã®ããŒã¿ã»ãœãŒã¹ã®å Žåãå¹²æžãé²ããšã¯ãã¹ããªãŒã ã»ãã€ãã©ã€ã³ã®å®è¡äžã«ããŒã¿ã»ãœãŒã¹ãäžå倿Žãããªãããšãæå³ããŸãã ããã«å¯Ÿããé¡èãªäŸå€ã¯ãåæå€æŽãæ±ããããã«ç¹å¥ã«èšèšããã䞊è¡ã³ã¬ã¯ã·ã§ã³ããœãŒã¹ã«æã€ã¹ããªãŒã ã§ãã 䞊è¡ã¹ããªãŒã ã»ãœãŒã¹ã¯ãSpliteratorããCONCURRENTç¹æ§ãå ±åããããœãŒã¹ã§ãã
ãããã£ãŠããœãŒã¹ã䞊è¡çã§ãªãå¯èœæ§ã®ããã¹ããªãŒã ã»ãã€ãã©ã€ã³ã«å«ãŸããåäœãã©ã¡ãŒã¿ã¯ãã¹ããªãŒã ã®ããŒã¿ã»ãœãŒã¹ã決ããŠå€æŽãã¹ãã§ã¯ãããŸããã åäœãã©ã¡ãŒã¿ãé䞊è¡ããŒã¿ã»ãœãŒã¹ã«å¹²æžãããšèšãããã®ã¯ãåäœãã©ã¡ãŒã¿ãã¹ããªãŒã ã®ããŒã¿ã»ãœãŒã¹ã倿Žãããããã®ãããªå€æŽã®åŒãéãšãªãå Žåã§ãã éå¹²æžã®å¿ èŠæ§ã¯ã䞊è¡ãã€ãã©ã€ã³ã ãã§ãªãããã¹ãŠã®ãã€ãã©ã€ã³ã«åœãŠã¯ãŸããŸãã ã¹ããªãŒã ã»ãœãŒã¹ã䞊è¡çã§ãªãéããã¹ããªãŒã ã»ãã€ãã©ã€ã³ã®å®è¡äžã«ã¹ããªãŒã ã®ããŒã¿ã»ãœãŒã¹ã倿ŽãããšãäŸå€ãäžæ£ãªåçããŸãã¯äžé©åãªåäœãçºçããå¯èœæ§ããããŸãã é©åã«åäœããã¹ããªãŒã ã»ãœãŒã¹ã®å Žåãçµç«¯æäœãéå§ãããåã§ããã°ãœãŒã¹ã倿Žã§ãããããã倿Žã¯å¯Ÿè±¡ãšãªãèŠçŽ ã«åæ ãããŸãã ããšãã°ã次ã®ã³ãŒããèããŠã¿ãŸãããã
List<String> l = new ArrayList(Arrays.asList("one", "two"));
Stream<String> sl = l.stream();
l.add("three");
String s = sl.collect(joining(" "));
ãŸãã2ã€ã®æååoneãštwoããæããªã¹ããäœæãããŸãã æ¬¡ã«ããã®ãªã¹ãããã¹ããªãŒã ãäœæãããŸãã æ¬¡ã«ããªã¹ãã倿Žããããã«ã3ã€ç®ã®æååthreeã远å ãããŸãã æåŸã«ãã¹ããªãŒã ã®èŠçŽ ãéããããŠé£çµãããŸãã ãªã¹ãã倿Žãããã®ã¯çµç«¯æäœcollectãéå§ãããåã ã£ãã®ã§ãçµæã¯æååone two threeã«ãªããŸãã JDKã³ã¬ã¯ã·ã§ã³ãä»ã®å€§éšåã®JDKã¯ã©ã¹ããè¿ãããã¹ããªãŒã ã¯ãã¹ãŠããã®ããã«é©åã«åäœããŸãããã®ä»ã®ã©ã€ãã©ãªã§çæãããã¹ããªãŒã ã«ã€ããŠã¯ããäœã¬ãã«ã®ã¹ããªãŒã æ§ç¯ããåç
§ããé©åã«åäœããã¹ããªãŒã ãæ§ç¯ããããã®èŠä»¶ã確èªããŠãã ããã
map()ã«å¯Ÿãããã©ã¡ãŒã¿ããã¹ããŒããã«ã»ã©ã ãã®äžäŸã§ãã
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
ããã§ããããã³ã°æäœã䞊åå®è¡ããããšãã¹ã¬ããã®ã¹ã±ãžã¥ãŒãªã³ã°ã®éãã«ãããåãå
¥åã«å¯Ÿããçµæãå®è¡ã®ãã³ã«å€ããå¯èœæ§ããããŸããäžæ¹ãã¹ããŒãã¬ã¹ãªã©ã ãåŒã§ã¯ãçµæã¯åžžã«åãã«ãªããŸãã
ãŸããåäœãã©ã¡ãŒã¿ããå¯å€ç¶æ ãžã®ã¢ã¯ã»ã¹ã詊ã¿ãããšã¯ãå®å šæ§ãããã©ãŒãã³ã¹ã®ç¹ããè¯ããªãéžæè¢ãšèšããŸãããã®ç¶æ ãžã®ã¢ã¯ã»ã¹ã®åæãåããªãã£ãå ŽåãããŒã¿ç«¶åãçºçããããã«ã³ãŒããäžæããŠããŸããŸããããã®ç¶æ ãžã®ã¢ã¯ã»ã¹ã®åæãåã£ãå ŽåãåŸãããšããŠããäžŠåæ§ã®ã¡ãªãããç«¶åã«ãã£ãŠèããŠããŸãå±éºæ§ããããŸãã æè¯ã®ã¢ãããŒãã¯ãã¹ããªãŒã æäœã®ã¹ããŒããã«åäœãã©ã¡ãŒã¿ãäžå䜿çšããªãããšã§ããéåžžã¯ãã¹ããªãŒã ã»ãã€ãã©ã€ã³ãåæ§æããŠã¹ããŒããã«ã«ãªãã®ãé¿ããæ¹æ³ããããŸãã
åäœãã©ã¡ãŒã¿ãå¯äœçšãæã€å Žåã¯ãç¹ã«æèšãããŠããªãéããä»ã®ã¹ã¬ããããã®ããããå¯äœçšã®å¯èŠæ§ã«é¢ããä¿èšŒã¯äžåãªããåãã¹ããªãŒã ã»ãã€ãã©ã€ã³å
ã§ã®åãèŠçŽ ã«å¯ŸããããŸããŸãªæäœãåäžã¹ã¬ããå
ã§å®è¡ãããä¿èšŒããããŸããã ããã«ãããããå¯äœçšã®é åºä»ãã¯ãé©ãã¹ããã®ã«ãªãå¯èœæ§ããããŸãã ã¹ããªãŒã ã»ãœãŒã¹ã®æ€åºé åºãšççŸããªãçµæãçæããããã«ãã€ãã©ã€ã³ãå¶çŽãããŠããå Žåã§ã(ããšãã°ãIntStream.range(0,5).parallel().map(x -> x*2).toArray()ã¯[0, 2, 4, 6, 8]ãçæããå¿
èŠããã)ãããããŒé¢æ°ãåã
ã®èŠçŽ ã«é©çšãããé åºããä»»æã®åäœãã©ã¡ãŒã¿ãã©ã®ã¹ã¬ããå
ã§ç¹å®ã®èŠçŽ ã«å¯ŸããŠå®è¡ãããããã«é¢ããä¿èšŒã¯äžåãããŸããã
å¯äœçšã䜿çšããããªããããªèšç®ã®å€ãã¯ãå¯äœçšã䜿ããã«ããå®å
šãã€å¹ççã«è¡šçŸããããšãã§ããŸã(å¯å€ã¢ãã¥ã ã¬ãŒã¿ã®ä»£ããã«ãªãã¯ã·ã§ã³ã䜿çšãããªã©)ã ãã ããprintln()ããããã°ç®çã§äœ¿çšãããªã©ã®å¯äœçšã¯ãéåžžç¡å®³ã§ãã å¯äœçšãä»ããªããšåäœã§ããªãã¹ããªãŒã æäœã¯ãforEach()ãpeek()ãªã©ãããå°æ°ã§ãããããã¯æ³šæããŠäœ¿çšãã¹ãã§ãã
å¯äœçšãäžé©åã«äœ¿çšããŠããã¹ããªãŒã ã»ãã€ãã©ã€ã³ããå¯äœçšã䜿çšããªããã€ãã©ã€ã³ã«å€æããæ¹æ³ã®äžäŸãšããŠãæå®ãããæ£èŠè¡šçŸã«äžèŽããæååãæååã¹ããªãŒã å ã§æ€çŽ¢ããäžèŽããæååããªã¹ãå ã«æ ŒçŽããã³ãŒãããæ¬¡ã«ç€ºããŸãã
ArrayList<String> results = new ArrayList<>();
stream.filter(s -> pattern.matcher(s).matches())
.forEach(s -> results.add(s)); // Unnecessary use of side-effects!
ãã®ã³ãŒãã§ã¯å¯äœçšãäžå¿
èŠã«äœ¿çšãããŠããŸãã 䞊åå®è¡æã«ã¯ãArrayListãã¹ã¬ããã»ãŒãã§ãªãããã«äžæ£ãªçµæãçæãããŸãããå¿
èŠãªåæã远å ããã°ç«¶åãçºçããäžŠåæ§ã®ã¡ãªãããèããŸãã ããã«èšãã°ãããã§å¯äœçšã䜿çšããå¿
èŠã¯ãŸã£ãããããŸãããforEach()ã¯åçŽã«ãããå¹ççã§å®å
šãªã䞊ååã«ããé©ãããªãã¯ã·ã§ã³æäœã§çœ®ãæããããšãã§ããŸãã
List<String>results =
stream.filter(s -> pattern.matcher(s).matches())
.collect(Collectors.toList()); // No side-effects!
ã¹ããªãŒã ã¯ãå®çŸ©ãããæ€åºé åºãæã€ããšãæããªãããšããããŸãã ã¹ããªãŒã ãæ€çŽ¢é åºãæã€ãã©ããã¯ããã®ãœãŒã¹ãšäžéæäœã«ãã£ãŠæ±ºãŸããŸãã ã¹ããªãŒã ã»ãœãŒã¹ã®äžã«ã¯ãæ¬è³ªçã«é åºä»ãããããã®(Listãé
åãªã©)ãããã°ãããã§ãªããã®(HashSetãªã©)ããããŸãã äžéæäœã®äžã«ã¯ãsorted()ã®ããã«ãããšããšé åºä»ããããŠããªãã¹ããªãŒã ã«æ€åºé åºã課ããã®ãããã°ãBaseStream.unordered()ã®ããã«ãé åºä»ããããã¹ããªãŒã ãé åºä»ããªãã«å€æŽãããã®ããããŸãã ããã«çµç«¯æäœã®äžã«ã¯ãforEach()ã®ããã«æ€åºé åºãç¡èŠãããã®ããããŸãã
é åºä»ããããã¹ããªãŒã ã§ã¯ãã»ãšãã©ã®æäœã¯èŠçŽ ãæ€åºé ã«åŠçããããå¶çŽãããŸããã¹ããªãŒã ã®ãœãŒã¹ã[1, 2, 3]ãå«ãListã§ããå Žåãmap(x -> x*2)ã®å®è¡çµæã¯[2, 4, 6]ã§ãªããã°ãããŸããã äžæ¹ããœãŒã¹ã«æ€åºé åºãå®çŸ©ãããŠããªãå Žåã¯ãå€[2, 4, 6]ã®èŠçŽ ãä»»æã«å
¥ãæ¿ãããã®ããæå¹ãªçµæã«ãªããŸãã
é æ¬¡ã¹ããªãŒã ã®å Žåãæ€åºé åºã®æç¡ã¯ããã©ãŒãã³ã¹ã«ã¯åœ±é¿ãããæ±ºå®è«ã«ã®ã¿åœ±é¿ããŸãã ã¹ããªãŒã ãé åºä»ããããŠããå Žåã¯ãåäžãœãŒã¹ã§åäžã®ã¹ããªãŒã ã»ãã€ãã©ã€ã³ãç¹°ãè¿ãå®è¡ããŠãåäžã®çµæãçæãããŸããé åºä»ããããŠããªãå Žåã¯ãç¹°ãè¿ãå®è¡ãããšç°ãªãçµæãçæãããå¯èœæ§ããããŸãã
䞊åã¹ããªãŒã ã®å Žåãé åºä»ãã®å¶çŽãç·©åãããšãå®è¡ã®å¹çæ§ãæ¹åã§ããããšããããŸãã éè€ãã£ã«ã¿ãªã³ã°(distinct())ãã°ã«ãŒãåãªãã¯ã·ã§ã³(Collectors.groupingBy())ãšãã£ãç¹å®ã®éçŽæäœã¯ãèŠçŽ ã®é åºä»ããç¡èŠã§ããã°ãããå¹ççã«å®è£
ã§ããŸãã åæ§ã«ãlimit()ã®ãããªãæ€åºé åºãšæ¬è³ªçãªé¢é£æ§ãæã€æäœã§ã¯ãé©åãªé åºä»ãã®ããã«ãããã¡ãªã³ã°ã®å¿
èŠæ§ãçããäžŠåæ§ã®ã¡ãªãããèããŠããŸãå¯èœæ§ããããŸãã ã¹ããªãŒã ã«æ€åºé åºãå«ãŸããŠãããããŠãŒã¶ãŒã¯ãã®æ€åºé åºã®ããšã¯ç¹ã«æ°ã«ããŠããªãããšããå Žåãunordered()ã§ã¹ããªãŒã ã®é åºä»ããæç€ºçã«è§£é€ããããšã§ãäžéšã®ã¹ããŒããã«æäœãçµç«¯æäœã§äžŠåæã®ããã©ãŒãã³ã¹ãæ¹åãããå¯èœæ§ããããŸãã ãã ããåè¿°ã®ããããã¯ã®éãã®åèšãäŸãªã©ã倧éšåã®ã¹ããªãŒã ã»ãã€ãã©ã€ã³ã¯ãé åºä»ãå¶çŽã®äžã§ãå¹ççã«äžŠååãããŸãã
reduce()ãcollect()ãšåŒã°ããè€æ°ã®åœ¢åŒã®æ±çšãªãã¯ã·ã§ã³æäœãšãsum()ãmax()ãcount()ãªã©ãè€æ°ã®ç¹æ®åããããªãã¯ã·ã§ã³åœ¢åŒãå«ãŸããŠããŸãã
ãã¡ããããã®ãããªæäœã¯ã次ã®ããã«åçŽãªé 次åŠçã«ãŒããšããŠç°¡åã«å®è£ ã§ããŸãã
int sum = 0;
for (int x : numbers) {
sum += x;
}
ãã ããäžã®ãããªæšç§»çèç©ããããªãã¥ãŒã¹æäœã奜ãçç±ããããŸãã ãªãã¯ã·ã§ã³ã¯æœè±¡åºŠãããé«ã(åã
ã®èŠçŽ ã§ã¯ãªãã¹ããªãŒã å
šäœã«äœçšãã)ã ãã§ãªããé©åã«æ§ç¯ããããªãã¥ãŒã¹æäœã¯æ¬è³ªçã«äžŠååå¯èœãšãªããŸã(ãã ããèŠçŽ ã®åŠçã«äœ¿çšããã颿°ãçµåçãã€ã¹ããŒãã¬ã¹ã§ããå¿
èŠããã)ã ããšãã°ãäžããããæ°å€ã¹ããªãŒã ã«ã€ããŠãåèšãèšç®ããå Žåã«ã¯ã次ã®ããã«èšè¿°ã§ããŸãã
int sum = numbers.stream().reduce(0, (x,y) -> x+y);
ãŸãã¯
int sum = numbers.stream().reduce(0, Integer::sum);
ãããã®ãªãã¯ã·ã§ã³æäœã¯ãã»ãšãã©äœã倿ŽããªããŠããå®å šã«äžŠåå®è¡ã§ããŸãã
int sum = numbers.parallelStream().reduce(0, Integer::sum);
ãªãã¯ã·ã§ã³ã®äžŠååãè¯å¥œã«è¡ããã®ã¯ãå®è£
ããããŒã¿ã®ãµãã»ããã䞊ååŠçããåŸãäžéçµæãçµåããŠæçµçãªæ£ããçããåŸãããšãã§ããããã§ãã (ã䞊åçšã®for-eachãæ§æãèšèªã«å«ãŸããŠãããšããŠããæšç§»çèç©ã¢ãããŒãã§ã¯ãã¯ããå
±æãããèç©çšå€æ°sumã«å¯Ÿããã¹ã¬ããã»ãŒããªæŽæ°ãéçºè
ãè¡ãå¿
èŠãããããã®ããã«å¿
èŠãšãããåæã«ãã£ãŠãäžŠåæ§ã«ããããã©ãŒãã³ã¹åäžãæã¡æ¶ãããŠããŸãå¯èœæ§ããããŸãã) 代ããã«reduce()ã䜿çšããã°ããªãã¯ã·ã§ã³æäœã®äžŠååã«é¢ããããããéè·ãæ¶å€±ããã©ã€ãã©ãªã¯åæã远å ããªããŠãå¹ççãªäžŠåå®è£
ãæäŸã§ããŸãã
å
ã«ç€ºãããŠã£ãžã§ããã®äŸã¯ããªãã¯ã·ã§ã³ãšä»ã®æäœãçµã¿åãããããšã§ã倧éã®æŒç®ãå«ãforã«ãŒãã眮ãæããæ¹æ³ã瀺ããŠããŸãã widgetsããgetWeightã¡ãœãããå«ãWidgetãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ã§ããå Žåããã£ãšãéããŠã£ãžã§ãããèŠã€ããã«ã¯æ¬¡ã®ããã«ããŸãã
OptionalInt heaviest = widgets.parallelStream()
.mapToInt(Widget::getWeight)
.max();
ããæ±çšçãªåœ¢åŒã®ã<T>åã®èŠçŽ ã«äœçšããŠ<U>åã®çµæãçæããreduceæäœã§ã¯ã次ã®3ã€ã®ãã©ã¡ãŒã¿ãå¿
èŠã«ãªããŸãã
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner);
ããã§ãidentityèŠçŽ ã¯ããªãã¯ã·ã§ã³ã®åæã·ãŒãå€ã§ãããšãšãã«ãå
¥åèŠçŽ ãååšããªãå Žåã®ããã©ã«ãçµæã§ããããŸãã accumulator颿°ã¯ãéšåçãªçµæã𿬡ã®èŠçŽ ãåãåããæ°ããéšåçãªçµæãçæããŸãã combiner颿°ã¯ã2ã€ã®éšåçãªçµæãçµåããæ°ããéšåçãªçµæãçæããŸãã (ã³ã³ãã€ãã¯äžŠåãªãã¯ã·ã§ã³ã§å¿
èŠã«ãªããŸãã䞊åãªãã¯ã·ã§ã³ã§ã¯å
¥åãåå²ãããããŒãã£ã·ã§ã³ããšã«éšåçãªèç©å€ãèšç®ãããåŸãéšåçãªçµæãçµåãããŠæçµçµæãçæãããŸãã)
ããæ£åŒã«ã¯ãidentityå€ã¯ã³ã³ãã€ã颿°ã®åäœå
ã§ãªããã°ãããŸããã ã€ãŸãããã¹ãŠã®uã«ã€ããŠãcombiner.apply(identity, u)ãuã«çãããªããŸãã ããã«ãcombiner颿°ã¯çµåçã§ããå¿
èŠãããããã€accumulator颿°ãšäºææ§ãããå¿
èŠããããŸãããã¹ãŠã®uãštã«ã€ããŠãcombiner.apply(u, accumulator.apply(identity, t))ãšaccumulator.apply(u, t)ãequals()ã§çãããªãå¿
èŠããããŸãã
3åŒæ°åœ¢åŒã¯2åŒæ°åœ¢åŒãäžè¬åãããã®ã§ããããããã³ã°ã»ã¹ããããèç©ã¹ãããã«çµã¿èŸŒãŸããŠããŸãã åçŽãªééåèšã®äŸããããæ±çšçãªåœ¢åŒã䜿ã£ãŠæ¬¡ã®ããã«æžãçŽãããšãã§ããŸãã
int sumOfWeights = widgets.stream()
.reduce(0,
(sum, b) -> sum + b.getWeight())
Integer::sum);
ãã ããæç€ºçãªããã-ãªãã¥ãŒã¹åœ¢åŒã®ã»ããå¯èªæ§ãé«ãã®ã§ãéåžžã¯ãã¡ãã䜿çšããããšããèŠãããŸãã äžè¬åããã圢åŒã¯ããããã³ã°ãšãªãã¯ã·ã§ã³ãåäžã®é¢æ°ã«ãŸãšããããšã§ãããªãã®äœæ¥éãçããŠæé©åã§ããå Žåã®ããã«çšæãããŠããŸãã
CollectionãStringBuilderãªã©)ã«å
¥åèŠçŽ ãèç©ããŸãã
æååã®ã¹ããªãŒã ãåãåããæååãé£çµããŠåäžã®é·ãæååã«ããå¿ èŠãããå Žåãéåžžã®ãªãã¯ã·ã§ã³ã䜿ã£ãŠãããå®çŸã§ããŸãã
String concatenated = strings.reduce("", String::concat)
ããã§å¿
èŠãªçµæãåŸãããŸããã䞊åã§ãåäœããŸãã ãã ããããã©ãŒãã³ã¹ã«æºè¶³ã§ããªãå¯èœæ§ããããŸãã ãã®ãããªå®è£
ã¯å€§éã®æååã³ããŒãè¡ããããå®è¡æéã¯O(n^2)(nã¯æåæ°)ã«ãªããŸãã ããé«ããã©ãŒãã³ã¹ãªã¢ãããŒãã¯ãæååèç©çšã®å¯å€ã³ã³ããã§ããStringBuilderå
ã«çµæãèç©ããããšã§ãã å¯å€ãªãã¯ã·ã§ã³ã䞊ååããéã«ã¯ãéåžžã®ãªãã¯ã·ã§ã³ã®å Žåãšåããã¯ããã¯ã䜿çšã§ããŸãã
å¯å€ãªãã¯ã·ã§ã³æäœã«ã¯collect()ãšããååãä»ããŠããŸãããããã¯ãCollectionãªã©ã®çµæã³ã³ããå
ã«å¿
èŠãªçµæãéããããã§ãã collectã¯3ã€ã®é¢æ°ãèŠæ±ããŸããçµæã³ã³ããã®æ°ããã€ã³ã¹ã¿ã³ã¹ãæ§ç¯ãããµãã©ã€ã€é¢æ°ãçµæã³ã³ããã«å
¥åèŠçŽ ãçµã¿èŸŒãã¢ãã¥ã ã¬ãŒã¿é¢æ°ãããçµæã³ã³ããã®å
容ãå¥ã®ã³ã³ããã«ããŒãžããçµå颿°ã§ãã ãã®åœ¢åŒã¯ãéåžžã®ãªãã¯ã·ã§ã³ã®æ±çšåœ¢åŒã«éåžžã«äŒŒãŠããŸãã
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner);
collectããã®ãããªæœè±¡çãªæ¹æ³ã§è¡šçŸããã¡ãªããã¯ãreduce()ã®å ŽåãšåãããçŽæ¥çãªäžŠååãå¯èœã«ãªãç¹ã«ãããŸããããã€ãã®éšåçãªçµæã䞊åããŠèç©ããåŸãããããçµåããããšãã§ããŸã(ãã ããèç©é¢æ°ãšçµå颿°ã該åœããèŠä»¶ãæºããå¿
èŠããã)ã ããšãã°ãã¹ããªãŒã å
ã®èŠçŽ ã®String衚çŸãArrayListå
ã«éããã«ã¯ã次ã®ãããªæãããªé 次for-each圢åŒãèšè¿°ã§ããŸãã
ArrayList<String> strings = new ArrayList<>();
for (T element : stream) {
strings.add(element.toString());
}
ãããã¯ã䞊ååå¯èœãªcollect圢åŒã䜿çšããããšãã§ããŸãã
ArrayList<String> strings = stream.collect(() -> new ArrayList<>(),
(c, e) -> c.add(e.toString()),
(c1, c2) -> c1.addAll(c2));
ãããã¯ãã¢ãã¥ã ã¬ãŒã¿é¢æ°ãããããã³ã°æäœãæãåºããæ¬¡ã®ããã«ããç°¡æœã«è¡šçŸããããšãã§ããŸãã
List<String> strings = stream.map(Object::toString)
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
ããã§ããµãã©ã€ã€ã¯åãªãArrayListã®ã³ã³ã¹ãã©ã¯ã¿ã§ãããã¢ãã¥ã ã¬ãŒã¿ã¯æåååãããèŠçŽ ãArrayListã«è¿œå ããã³ã³ãã€ãã¯åçŽã«addAllã䜿ã£ãŠäžæ¹ã®ã³ã³ããã®æååã仿¹ã«ã³ããŒããŸãã
collectã®3ã€ã®åŽé¢ã§ãããµãã©ã€ã€ãã¢ãã¥ã ã¬ãŒã¿ãã³ã³ãã€ãã¯ç·å¯ã«çµåããŠããŸãã Collectorãšããæœè±¡ã䜿ãã°ã3ã€ãã¹ãŠã®åŽé¢ãæããããšãã§ããŸãã Listå
ã«æååãéããäžã®äŸã¯ãæšæºã®Collectorã䜿ã£ãŠæ¬¡ã®ããã«æžãæããããšãã§ããŸãã
List<String> strings = stream.map(Object::toString)
.collect(Collectors.toList());
å¯å€ãªãã¯ã·ã§ã³ãCollectorå
ã«ããã±ãŒãžåããããšã«ã¯ãåæå¯èœæ§ãšãããã1ã€ã®ã¡ãªããããããŸãã ã¯ã©ã¹Collectorsã«å«ãŸããããŸããŸãªå®çŸ©æžã®ã³ã¬ã¯ã¿ã»ãã¡ã¯ããªã®äžã«ã¯ãããã³ã¬ã¯ã¿ãå¥ã®ã³ã¬ã¯ã¿ã«å€æããã³ã³ãããŒã¿ãå«ãŸããŠããŸãã ããšãã°ãåŸæ¥å¡ã¹ããªãŒã ã®çµŠæã®åèšãèšç®ããæ¬¡ã®ãããªã³ã¬ã¯ã¿ããããšããŸãã
Collector<Employee, ?, Integer> summingSalaries
= Collectors.summingInt(Employee::getSalary);
(2çªç®ã®åãã©ã¡ãŒã¿ã®?ã¯ããã®ã³ã¬ã¯ã¿ã§äœ¿çšãããäžé衚çŸã«ã¯èå³ããªãããšã瀺ããŠããã ãã§ãã) 絊æã®éšéå¥åèšã®è¡šãäœæããã³ã¬ã¯ã¿ãäœæããå ŽåãgroupingByã䜿ãã°summingSalariesãåå©çšã§ããŸãã
Map<Department, Integer> salariesByDept
= employees.stream().collect(Collectors.groupingBy(Employee::getDepartment,
summingSalaries));
éåžžã®ãªãã¯ã·ã§ã³æäœã®å Žåãšåãããcollect()æäœã䞊ååã§ããã®ã¯ã該åœã®æ¡ä»¶ãæºããããå Žåã ãã§ãã éšåçã«èç©ãããä»»æã®çµæã«ã€ããŠããã®çµæã空ã®çµæã³ã³ãããšçµåãããšãã«å
ãšåãçµæãçæãããå¿
èŠããããŸãã ã€ãŸããäžé£ã®ã¢ãã¥ã ã¬ãŒã¿åŒåºããã³ã³ãã€ãåŒåºãã®çµæãšããŠåŸããããéšåçã«èç©ãããçµæpã«ã€ããŠãpã¯combiner.apply(p, supplier.get())ãšçãããªãå¿
èŠããããŸãã
ããã«ãèšç®ãåå²ããŠãåãçµæãåŸãããå¿
èŠããããŸãã ä»»æã®å
¥åèŠçŽ t1ãšt2ã«ã€ããŠã以äžã®èšç®ã®çµær1ãšr2ãçãããªãå¿
èŠããããŸãã
A a1 = supplier.get();
accumulator.accept(a1, t1);
accumulator.accept(a1, t2);
R r1 = finisher.apply(a1); // result without splitting
A a2 = supplier.get();
accumulator.accept(a2, t1);
A a3 = supplier.get();
accumulator.accept(a3, t2);
R r2 = finisher.apply(combiner.apply(a2, a3)); // result with splitting
ããã§ãç䟡æ§ã®å€å®ã¯äžè¬ã«Object.equals(Object)ã«ãããŸãããé åºã®éããèæ
®ããããã«ç䟡æ§ã®æ¡ä»¶ãç·©åãããããšããããŸãã
Mapãçæããcollect()ãèããŸãã
Map<Buyer, List<Transaction>> salesByBuyer
= txns.parallelStream()
.collect(Collectors.groupingBy(Transaction::getBuyer));
ãã®æäœã䞊åå®è¡ãããšãå®éã«ã¯é广ãšãªãå¯èœæ§ããããŸãã ããã¯ãçµåã¹ããã(ããMapãããŒã«åºã¥ããŠå¥ã®ãããã«ããŒãžããã¹ããã)ã®ã³ã¹ãããäžéšã®Mapå®è£
ã§é«ããªãå¯èœæ§ãããããã§ãã
ãšãããããã®ãªãã¯ã·ã§ã³ã§äœ¿çšãããçµæã³ã³ããããConcurrentHashMapã®ãããªãåæå€æŽå¯èœãªã³ã¬ã¯ã·ã§ã³ã§ãã£ããšããŸãã ãã®å Žåãã¢ãã¥ã ã¬ãŒã¿ã®äžŠååŒåºãã§ã¯ãå®éã«ã¯åãå
±æçµæã³ã³ããã«çµæãåæã«èç©ã§ãããããã³ã³ãã€ãã§è€æ°ã®çµæã³ã³ãããããŒãžããå¿
èŠããªããªããŸãã ããã«ããã䞊åå®è¡ã®ããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãã ããã䞊è¡ãªãã¯ã·ã§ã³ãšåŒã³ãŸãã
䞊è¡ãªãã¯ã·ã§ã³ããµããŒãããCollectorã«ã¯ãCollector.Characteristics.CONCURRENTç¹æ§ã®ããŒã¯ãä»ããããŠããŸãã ãã ãã䞊è¡ã³ã¬ã¯ã·ã§ã³ã«ã¯ãã¡ãªããããããŸãã è€æ°ã®ã¹ã¬ããããåæã«å
±æã³ã³ããã«çµæãèç©ãããã®ã§ãçµæãèç©ãããé çªãéæ±ºå®è«çã«ãªããŸãã ãããã£ãŠã䞊è¡ãªãã¯ã·ã§ã³ãå¯èœãªã®ã¯ãåŠç察象ã®ã¹ããªãŒã ã§é åºä»ããéèŠã§ãªãå Žåã®ã¿ã«ãªããŸãã Stream.collect(Collector)å®è£
ã䞊è¡ãªãã¯ã·ã§ã³ãå®è¡ããã®ã¯ã次ã®å Žåã ãã§ãã
Collector.Characteristics.CONCURRENTç¹æ§ãæã£ãŠããŠãCollector.Characteristics.UNORDEREDç¹æ§ãæã€ã
BaseStream.unordered()ã¡ãœããã䜿çšããŸãã ããšãã°ã
Map<Buyer, List<Transaction>> salesByBuyer
= txns.parallelStream()
.unordered()
.collect(groupingByConcurrent(Transaction::getBuyer));
(ããã§ãCollectors.groupingByConcurrent(java.util.function.Function<? super T, ? extends K>)ã¯groupingByã®äžŠè¡çã§ã)ã
ããç¹å®ã®ããŒã®åèŠçŽ ããœãŒã¹ãšåãé çªã§çŸããããšãéèŠã§ããå Žåã«ã¯ã䞊è¡ãªãã¯ã·ã§ã³ã¯äœ¿çšã§ããŸãããé åºä»ãã¯ãäžŠè¡æ¿å ¥ã§ç ç²ã«ãªããã®ã®1ã€ã ããã§ãã ãã®å Žåã¯ãé æ¬¡ãªãã¯ã·ã§ã³ãããŒãžããŒã¹ã®äžŠåãªãã¯ã·ã§ã³ãå®è£ ããããã«å¶çŽãããŸãã
opãçµåçãšãªãã®ã¯ã次ãæãç«ã€å Žåã§ãã
(a op b) op c == a op (b op c)
ããã§é
ã4ã€ã«å¢ããã°ã䞊åè©äŸ¡ã§ã®ããã®éèŠæ§ãæç¢ºã«ãªããŸãã
a op b op c op d == (a op b) op (c op d)
ãããã£ãŠã(a op b)ãš(c op d)ã䞊åã«è©äŸ¡ããåŸããããã®çµæã«å¯ŸããŠopãåŒã³åºãããšãã§ããŸãã
çµåçãªæŒç®ã®äŸãšããŠãæ°å€ã®å ç®ãæå°ãæå€§ãããã³æååã®é£çµãæããããŸãã
Collection.stream()ãArrays.stream(Object[])ã®ãããªã¡ãœããã䜿ã£ãŠã¹ããªãŒã ãååŸãããŠããŸããã ãããã®ã¹ããªãŒã çæã¡ãœããã¯ã©ã®ããã«å®è£
ãããŠããã®ã§ããããã
ã¯ã©ã¹StreamSupportã«ã¯ãã¹ããªãŒã äœæçšã®äœã¬ãã«ã®ã¡ãœãããããã€ãå«ãŸããŠããŸããããããã¯ãã¹ãŠããªãããã®åœ¢åŒã®Spliteratorã䜿çšããŠããŸãã ã¹ããªããã¬ãŒã¿ã¯Iteratorã®äžŠåçã§ããã(ç¡éåã®å¯èœæ§ããã)èŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ãèšè¿°ããé æ¬¡åé²ãäžæ¬ãã©ããŒãµã«ãããã³å
¥åå
ã§äžŠååŠçå¯èœãªéšåãæãåã£ãŠå¥ã®ã¹ããªããã¬ãŒã¿å
ã«æ ŒçŽããæäœããµããŒãããŸãã æäœã¬ãã«ã§ã¯ããã¹ãŠã®ã¹ããªãŒã ãã¹ããªããã¬ãŒã¿ã«ãã£ãŠé§åãããŸãã
ã¹ããªããã¬ãŒã¿ãå®è£
ããããã§ã®å®è£
äžã®éžæè¢ã¯å€æ°ååšããŠããŸããããã®ã»ãšãã©ãã¹ãŠããå®è£
ã®åçŽããšããã®ã¹ããªããã¬ãŒã¿ã䜿çšããã¹ããªãŒã ã®å®è¡æããã©ãŒãã³ã¹ãšã®ãã¬ãŒããªãã®äžã«æãç«ã£ãŠããŸãã ãã£ãšãåçŽã ããã£ãšãäœããã©ãŒãã³ã¹ãªã¹ããªããã¬ãŒã¿ã®äœææ¹æ³ã¯ãSpliterators.spliteratorUnknownSize(java.util.Iterator, int)ã䜿ã£ãŠã€ãã¬ãŒã¿ããäœæããããšã§ãã ãã®ãããªã¹ããªããã¬ãŒã¿ã¯åäœã¯ãããã®ã®ã䞊åããã©ãŒãã³ã¹ãäœãããšãäºæ³ãããŸãããµã€ãºèšå®æ
å ±(åºç€ãšãªãããŒã¿ã»ã»ããã®å€§ãã)ã倱ãããŠããã»ããåçŽãããåå²ã¢ã«ãŽãªãºã ã«å¶çŽãããŠããããã§ãã
ããé«å質ã®ã¹ããªããã¬ãŒã¿ã¯ããã©ã³ã¹ã®åããæ¢ç¥ãµã€ãºã®ã¹ããªãããæ£ç¢ºãªãµã€ãºèšå®æ
å ±ãããã³ã¹ããªããã¬ãŒã¿ãããŒã¿ã®ãã®ä»ã®ããã€ãã®characteristicsãæäŸããŸã(ãããã®æ
å ±ã¯å®è£
å
ã§ãå®è¡ãæé©åããããã«äœ¿çšã§ãã)ã
å¯å€ããŒã¿ã»ãœãŒã¹ã®ã¹ããªããã¬ãŒã¿ã«ã¯ãããŒã¿ãžã®ãã€ã³ãã®ã¿ã€ãã³ã°ãšããããã1ã€ã®èª²é¡ããããŸããã¹ããªããã¬ãŒã¿ãäœæãããŠããã¹ããªãŒã ã»ãã€ãã©ã€ã³ãå®è¡ããããŸã§ã®éã«ãããŒã¿ã倿Žãããå¯èœæ§ãããããã§ãã ã¹ããªãŒã ã®ã¹ããªããã¬ãŒã¿ã¯ãIMMUTABLEãCONCURRENTã®ããããã®ç¹æ§ãå ±åããã®ãçæ³ã§ãããããã§ãªãå Žåã¯é
å»¶ãã€ã³ãã£ã³ã°ã§ããã¹ãã§ãã ãœãŒã¹ãæšå¥šã®ã¹ããªããã¬ãŒã¿ãçŽæ¥æäŸã§ããªãå Žåã¯ãSupplierã䜿ã£ãŠã¹ããªããã¬ãŒã¿ã鿥çã«æäŸããSupplierãåãåãããŒãžã§ã³ã®stream()çµç±ã§ã¹ããªãŒã ãæ§ç¯ããããšãã§ããŸãã ã¹ããªãŒã ã»ãã€ãã©ã€ã³ã®çµç«¯æäœãéå§ãããåŸã§åããŠããµãã©ã€ã€ããã¹ããªããã¬ãŒã¿ãååŸãããŸãã
ãããã®èŠä»¶ã«åŸãã°ãã¹ããªãŒã ã»ãœãŒã¹ã®å€æŽãšã¹ããªãŒã ã»ãã€ãã©ã€ã³ã®å®è¡ã®éã®æœåšçãªå¹²æžã®ã¹ã³ãŒããå€§å¹ ã«æžå°ããŸãã å¿ èŠãªç¹æ§ãåããã¹ããªããã¬ãŒã¿ã«åºã¥ãã¹ããªãŒã ããŸãã¯SupplierããŒã¹ã®ãã¡ã¯ããªåœ¢åŒã䜿çšããã¹ããªãŒã ã¯ãçµç«¯æäœãéå§ãããåã«ããŒã¿ã»ãœãŒã¹ã倿ŽãããŠã察å¿ã§ããŸã(ãã ããã¹ããªãŒã æäœã®åäœãã©ã¡ãŒã¿ããéå¹²æžãšã¹ããŒãã¬ã¹ã«é¢ããå¿ èŠæ¡ä»¶ãæºãããŠããå¿ èŠããããŸã)ã 詳现ã«ã€ããŠã¯ããéå¹²æžããåç §ããŠãã ããã
ãã°ãŸãã¯æ©èœãéä¿¡
詳现ãªAPIãªãã¡ã¬ã³ã¹ããã³éçºè
ããã¥ã¡ã³ãã«ã€ããŠã¯ãJava SEã®ããã¥ã¡ã³ããåç
§ããŠãã ããã ãã®ããã¥ã¡ã³ãã«ã¯ãæŠå¿µçãªæŠèŠãçšèªã®å®çŸ©ãåé¿æ¹æ³ãæå¹ãªã³ãŒãäŸãªã©ã®ãéçºè
ã察象ã«ãããã詳现ãªèª¬æãå«ãŸããŠããŸãã
Copyright © 1993, 2025, Oracle and/or its affiliates. All rights reserved. Use is subject to license terms. Documentation Redistribution Policyãåç
§ããŠãã ããã