çããã®å€ãã¯ãã§ã«ã¹ããªãŒã API-Java 8ã¹ããªãŒã ãå³ãã£ãŠããŸãããã³ã¬ã¯ã·ã§ã³ãé
åãä¹±æ°ããã®æ¢è£œã®ã¹ããªãŒã ã䜿çšããã ãã§ãªããæ ¹æ¬çã«æ°ããã¹ããªãŒã ãäœæããã人ãããŸãã ãããè¡ãã«ã¯ãã¹ããªãã¿ãŒãäœæããå¿
èŠããããŸãã
Spliteratorã¯ãå
éšããžãã¯ã®ãããªãã¯éšåã§ããã¹ããªãŒã ãåããŸãã ãã®èšäºã§ã¯ãã¹ããªãã¿ãŒãäœæããæ¹æ³ãšçç±ã説æããŸãã
ã¹ããªãã¿ãŒãšã¯
ã¹ããªãã¿ãŒã¯8ã€ã®ã¡ãœãããå«ãã€ã³ã¿ãŒãã§ãŒã¹ã§ããããã®ãã¡ã®4ã€ã¯ãã§ã«ããã©ã«ãã®å®è£
ãæã£ãŠããŸãã æ®ãã®ã¡ãœããã¯ã
tryAdvance
ã
trySplit
ã
estimateSize
ããã³
trySplit
ã§ãã ããªããã£ãå
int
ã
long
ããã³
double
ç¹å¥ãªã¹ããªãã¿ãŒå€æŽããããŸãããããã¯ããã¯ã·ã³ã°ãåé¿ããããã«ããã€ãã®è¿œå ã¡ãœããã远å ããŸãã ã¹ããªãã¿ãŒã¯éåžžã®ã€ãã¬ãŒã¿ãŒã®ãããªãã®ã§ãã äž»ãªéã-2ã€ã®éšåã«åå²ïŒåå²ïŒããæ©èœ-ã¯ãã¹ã¬ããã®äžŠåæäœã®åºæ¬ã§ãã ãŸããæé©åããããã«ãã¹ããªãã¿ãŒã«ã¯å€æ°ã®ãã©ã°ç¹æ§ããããæ£ç¢ºã«ãŸãã¯ã»ãŒãã®ãµã€ãºãå ±åã§ããŸãã æåŸã«ãã¹ããªãã¿ãŒã¯æ±ºããŠããŒã¿ãœãŒã¹ã倿ŽããŸãããã€ãã¬ãŒã¿ãŒã®ãããª
remove
ã¡ãœããã¯ãããŸããã ãã詳现ã«ã¡ãœãããæ€èšããŠãã ããã
- tryAdvanceïŒã³ã³ã·ã¥ãŒããŒïŒ
hasNext()
ããã³next()
ã€ãã¬ãŒã¿ãŒã¡ãœããã®hasNext()
ã ã¹ããªãã¿ãŒã«æ¬¡ã®èŠçŽ ãããå Žåãæž¡ããã颿°ããã®èŠçŽ ã§åŒã³åºããŠtrue
ãè¿ãå¿
èŠãããfalse
ãããã§ãªãå Žåã颿°ã¯åŒã³åºãããã«false
ãè¿ãfalse
ã - trySplitïŒïŒ -2ã€ã®å
±æã詊ã¿ãŸãã ãã®ã¡ãœããã¯ãå
ã®ããŒã¿ã»ããã®ååãå®è¡ããæ°ããã¹ããªãã¿ãŒãè¿ããŸãããçŸåšã®ã¹ããªãã¿ãŒèªäœã¯åŸåã«ãžã£ã³ãããŸãã ååãã»ãŒçããå Žåã«æé©ã§ãããããã¯å¿
èŠãããŸããã ç¡éã®ããŒã¿ã»ãããæã€ã¹ããªãã¿ãŒã¯ãç¹ã«äžåçã«åå²ãããŸããåå²åŸãã¹ããªãã¿ãŒã®1ã€ãæçµããªã¥ãŒã ãåŠçãã2çªç®ã®ã¹ããªãã¿ãŒã¯ç¡éã«æ®ããŸãã
trySplit()
ã¡ãœããã«ã¯ã null
ãå
±æããŠè¿ããªããšããæ³çæš©å©ãããnull
ïŒå¶ç¶ã«tryããããšã¯ãããŸããïŒã ããã¯éåžžãçŸåšã®ã¹ããªãã¿ãŒã«ããŒã¿ãã»ãšãã©æ®ã£ãŠããªãå ŽåïŒããšãã°ã1ã€ã®èŠçŽ ã®ã¿ïŒã«è¡ãããŸãã - ç¹æ§ïŒïŒ -ã¹ããªãã¿ãŒã®ç¹æ§ã®ããããã¹ã¯ãè¿ããŸãã çŸåšããã®ãã¡ã®8ã€ããããŸãã
- ORDERED-ããŒã¿ã®é åºãéèŠãªå Žåã ããšãã°ã
HashSet
å
ã®ããŒã¿ã®é åºã¯å®è£
ã«äŸåããããã HashSet
ã¹ããªãã¿ãŒã«ã¯ãã®ç¹æ§ããããŸããã ãã®ç¹æ§ããªããšããã©ã¬ã«ã¹ããªãŒã ãèªåçã«ç¡ç§©åºã¢ãŒãã«ç§»è¡ãããããåäœãéããªããŸãã ããŒã¿ãœãŒã¹ã«é åºããªãã£ããããããã«åŸãããšã¯ã§ããŸããã - DISTINCT-èŠçŽ ãæããã«äžæã§ããå Žåã
distinct()
æäœã®åŸã®Set
ãŸãã¯ã¹ããªãŒã ã¯ããã®ç¹æ§ãæã€ã¹ããªãã¿ãŒãäœæããŸãã ããšãã°ã Set
ããã®ã¹ããªãŒã ã«å¯Ÿããdistinct()
æäœã¯ãŸã£ããå®è¡ãããªããããæéãããããããŸããã - SORTED-ã¢ã€ãã ããœãŒããããŠããå Žåã ãã®å ŽåãORDEREDã®äž¡æ¹ãè¿ãã
getComparator()
ã¡ãœããããªãŒããŒã©ã€ãããŠããœãŒãã³ã³ãã¬ãŒã¿ãŸãã¯ã èªç¶é åº ãã®å Žåã¯nullãè¿ãå¿
èŠããããŸãã ãœãŒããããã³ã¬ã¯ã·ã§ã³ïŒ TreeSet
ïŒã¯ããã®ç¹æ§ãæã€ã¹ããªãã¿ãŒãäœæããŸããããã«ããã sorted()
ãã¹ããªãŒã æäœsorted()
ãã¹ãããã§ããŸãã - SIZED-ã¹ããªãã¿ãŒèŠçŽ ã®æ£ç¢ºãªæ°ãããã£ãŠããå Žåã ãã®ç¹æ§ã¯ããã¹ãŠã®ã³ã¬ã¯ã·ã§ã³ã®ã¹ããªãã¿ãŒã«ãã£ãŠè¿ãããŸãã äžéšã®ã¹ããªãŒã æäœïŒããšãã°ã
map()
ãŸãã¯sorted()
ïŒã®åŸãä¿åãããä»ã®ã¹ããªãŒã æäœïŒããšãã°ã filter()
ãŸãã¯distinct()
ïŒåŸã«å€±ãããŸãã ããã¯ãœãŒãããããšãã°toArray()
æäœã«åœ¹ç«ã¡ãŸããé©åãªãµã€ãºã®é
åãäºåã«éžæã§ããå¿
èŠãªèŠçŽ ã®æ°ãæšæž¬ã§ããŸããã - SUBSIZED-ãã¹ãŠã®åã¹ããªãã¿ãŒããµã€ãºãèªèããããšãããã£ãŠããå Žåã ãã®ç¹æ§ã¯
ArrayList
ããã¹ããªãã¿ãŒã«ãã£ãŠè¿ãããŸããããã¯ãåå²ãããšãã«å€ã®ç¯å²ãæ¢ç¥ã®é·ãã®2ã€ã®ç¯å²ã«åçŽã«åå²ããããArrayList
ã ãããã HashSet
ã¯ãããè¿ããŸãããããã¯ãããã·ã¥ããŒãã«ãå£ãããã§ãããã®ãããåååã«ããã€ã®èŠçŽ ããããã¯ããããŸããã ãããã£ãŠãåã¹ããªãã¿ãŒã¯SIZEDãè¿ããŸããã - NONNULL-èŠçŽ éã«
null
ããªãããšãããã£ãŠããå Žåã ãã®ç¹æ§ã¯ãããšãã°ã ConcurrentSkipListSet
ã«ãã£ãŠäœæãããã¹ããªãã¿ãŒã«ãã£ãŠè¿ããnull
ããã®ããŒã¿æ§é ã«null
ãé
眮ããããšã¯ã§ããŸããã ãŸããããªããã£ãåã§äœæããããã¹ãŠã®ã¹ããªãã¿ãŒã«ãã£ãŠè¿ãããŸãã - IMMUTABLE-ã¯ããŒã«äžã«ããŒã¿ãœãŒã¹ã倿Žã§ããªãããšãããã£ãŠããå Žåã éåžžã®ã³ã¬ã¯ã·ã§ã³ããã®ã¹ããªãã¿ãŒã¯ãã®ãããªç¹æ§ãè¿ããŸããããããšãã°ã
Collections.singletonList()
ããã®ã¹ããªãã¿ãŒã¯ãã®ãªã¹ãã倿Žã§ããªãããããããæäŸããŸãã - 䞊è¡-ãœãŒã¹ãžã®å€æŽåŸãã¹ããªãã¿ãåäœãç¶ããããšãããã£ãŠããå Žåã ãã®ç¹æ§ã¯ã
java.util.concurrent
ã³ã¬ã¯ã·ã§ã³ã¹ããªãã¿ãŒã«ãã£ãŠå ±åãããŸãã ã¹ããªãã¿ã«IMMUTABLEããã³CONCURRENTç¹æ§ããªãå ŽåããœãŒã¹ã倿Žãããããšã«æ°ä»ããå Žåã«ConcurrentModificationException
ã¹ããŒããããã«ããã§ã€ã«ãã¡ãŒã¹ãã¢ãŒãã§åäœããããšäŸ¿å©ã§ãã
ç§ã®ç¥ãéããæåŸã®3ã€ã®ç¹æ§ã¯ã¹ã¬ããïŒJava 9ã³ãŒããå«ãïŒã§çŸåšäœ¿çšãããŠããŸããã - guessSize ïŒïŒ -ã¡ãœããã¯ãSIZEDã¹ããªãã¿ãŒã®æ®ãã®èŠçŽ æ°ãšãä»ã®å Žåã«å¯èœãªéãæãæ£ç¢ºãªæšå®å€ãè¿ãå¿
èŠããããŸãã ããšãã°ã
HashSet
ããã¹ããªãã¿ãŒãäœæãã trySplit()
ã䜿çšããŠã¹ããªãã¿ãŒãåå²ãããšã estimateSize()
ãµã€ãºestimateSize()
ã¯ã³ã¬ã¯ã·ã§ã³ã®å
ã®ãµã€ãºã®ååãè¿ããŸãããããã·ã¥ããŒãã«ã®ååã®å®éã®èŠçŽ æ°ã¯ç°ãªãå ŽåããããŸãã èŠçŽ ã®æ°ãç¡éã«ããå ŽåããŸãã¯èŠçŽ ã®ã«ãŠã³ããLong.MAX_VALUE
ãããå Žåã¯ã Long.MAX_VALUE
ãè¿ãããšãã§ãLong.MAX_VALUE
ã
æ¢åã®ã¹ããªãã¿ãŒã䜿çšããŠã¹ããªãŒã ãäœæããã®ã¯éåžžã«ç°¡åã§ã
-StreamSupport.streamïŒïŒãåŒã³åºãå¿
èŠããããŸãã
ã¹ããªãã¿ãŒãæžãå¿
èŠããªããšã
çè§£ãã¹ãäž»ãªããšã¯ãã¹ããªãã¿ãŒèªäœã¯å¿
èŠãªããã¹ããªãŒã ãå¿
èŠã§ããããšã§ãã æ¢åã®æ©èœã䜿çšããŠã¹ããªãŒã ãäœæã§ããå Žåã¯ããããè¡ãå¿
èŠããããŸãã ããšãã°ãXML DOMã¹ããªãŒã ãšåéã«ãªãã
NodeList
ã䜿çšããŠã¹ããªãŒã ãäœæãããšããŸãã ãã®ãããªæšæºçãªæ¹æ³ã¯ãããŸãããã远å ã®ã¹ããªãã¿ãªãã§ç°¡åã«èšè¿°ã§ããŸãã
public class XmlStream { static Stream<Node> of(NodeList list) { return IntStream.range(0, list.getLength()).mapToObj(list::item); } }
åæ§ã«ãä»»æã®éæšæºã³ã¬ã¯ã·ã§ã³ïŒå¥ã®äŸã¯
org.json.JSONArray
ïŒã«ã¹ããªãŒã ã远å ã§ããŸããããã«ãããåºæ°ã§é·ããšèŠçŽ ããã°ããè¿ãããšãã§ããŸãã
trySplit
ãæžãã®ãé£ãããæ ããŠãããš
trySplit
å Žåã¯ãã¹ããªãã¿ãŒããŸã£ããæžããªãæ¹ãè¯ãã§ãã æ¬¡ã«ããããã³ã¹ã¬ããã©ã€ãã©ãªãèšè¿°ãã䞊åã¹ã¬ããã®ååšãå®å
šã«ç¡èŠãã仲éã瀺ã
ãŸã ã 圌ã¯ãå
±ææ¹æ³ããŸã£ããããããªãã¹ããªãã¿ãŒãããããæžããã ãŸã£ããåå²ããªãã¹ããªãã¿ãŒã¯ãæªãã䟡å€ã®ãªãã¹ããªãã¿ãŒã§ãã ããããªãã§ãã ããã ãã®å Žåãéåžžã®ã€ãã¬ãŒã¿ãŒãèšè¿°ãã
Spliterators.spliteratorã¡ãœããã䜿çšããŠãã®äžã«ã¹ããªãã¿ãŒãäœæããããäºåã«ã³ã¬ã¯ã·ã§ã³ã®ãµã€ãºãããããªãå Žåã¯
Spliterators.spliteratorUnknownSizeãäœæããããšãã
å§ãããŸãã ãããã®ã¡ãœããã«ã¯ãå°ãªããšãé€ç®ã®ãã¥ãŒãªã¹ãã£ãã¯ããããŸããå埩åã®äžéšããã€ãã¹ãããããé
åã«æžç®ããŠããã®é
åã®æ°ããã¹ããªãã¿ãŒãäœæããŸãã ã¹ããªãŒã ãé·æéã®æäœãç¶ç¶ããå Žåã䞊ååã«ããäœæ¥ãå éãããŸãã
æšæºã®
Iterable
ãŸãã¯
Collection
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãããšã
default
spliterator()
default
ã¡ãœãããæäŸãããŸãã ãã¡ãããæ¹åã§ãããã©ããã確èªãã䟡å€ã¯ãããŸãã äœããã®æ¹æ³ã§ãã¹ããªãã¿ãŒãäœæããå¿
èŠã¯ã»ãšãã©ãããŸããã ããã¯ãããŒã¿æ§é ïŒããšãã°ã
leventovã®ããã«ããªããã£ãã®ã³ã¬ã¯ã·ã§ã³ïŒãéçºããŠããå Žåã«äŸ¿å©ã§ãã
ãããŠãŸã æžã
ãã®åé¡ã解決ããããã«ãæ°ããã¹ããªãã¿ãŒãäœæããŸããç¹å®ã®ã¹ããªãŒã ã®ãœãŒã¹ã¹ããªãŒã ã®é£æ¥ããå€ãããã¢ã®ã¹ããªãŒã ãäœæããŸãã Javaã§å€ã®ãã¢ã衚ãããã«äžè¬ã«åãå
¥ããããŠããã¿ã€ãã¯ãªããå¯èœãªãªãã·ã§ã³ãå€ãããããïŒ2ã€ã®å€ã®é
åã2ã€ã®å€ã®ãªã¹ããåãã¿ã€ãã®ããŒãšå€ãæã€
Map.Entry
ãªã©ã䜿çšïŒããŠãŒã¶ãŒã«æäŸããŸãïŒ2ã€ã®å€ãçµã¿åãããæ¹æ³ãåœŒã«æ±ºããããŸãã ã€ãŸããæ¬¡ã®ã·ã°ããã£ãæã€ã¡ãœãããäœæããå¿
èŠããããŸãã
public static <T, R> Stream<R> pairMap(Stream<T> stream, BiFunction<T, T, R> mapper) {...}
ããã«ãããä»»æã®ã¿ã€ãã䜿çšããŠãã¢ã衚ãããšãã§ããŸãã ããšãã°ã
Map.Entry
å¿
èŠãªå ŽåïŒ
public static <T> Stream<Map.Entry<T, T>> pairs(Stream<T> stream) { return pairMap(stream, AbstractMap.SimpleImmutableEntry<T, T>::new); }
ãããŠãäžè¬çã«ãäžéã³ã³ããã«ãã¢ãç©ã¿éããããšãªããããã«è峿·±ããã®ãèšç®ã§ããŸãã
public static Stream<Integer> diff(Stream<Integer> stream) { return pairMap(stream, (a, b) -> b - a); }
ãã®ã¡ãœããã¯ãæŽæ°ã®ã¹ããªãŒã ã«ãã飿¥èŠçŽ ã®å·®ã®ã¹ããªãŒã ãè¿ããŸãã ãæ³åã®ãšãããæçµã¹ããªãŒã ã§ã¯å
ã®èŠçŽ ããèŠçŽ ã1ã€å°ãªããªããŸãã
pairMap
éåžžã®äžéæäœã®ãã
pairMap
èŠãããã€ãŸããå®éã«ã¯ãã¿ãŒããã«æäœã«ãªããŸã§èšç®ãå®è¡ããªãããã«ããŸãã ãããè¡ãã«ã¯ãå
¥åã¹ããªãŒã ãã
spliterator
ãååŸããå¿
èŠããããŸãããæ±ãããããŸã§äœãããŸããã ãã1ã€ã®å°ãããéèŠãªããšïŒ
close()
æ°ããã¹ã¬ããã
close()
ãšãã¯ãå
ã®ã¹ã¬ãããéããå¿
èŠããããŸãã ãã®çµæãã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã
public static <T, R> Stream<R> pairMap(Stream<T> stream, BiFunction<T, T, R> mapper) { return StreamSupport.stream(new PairSpliterator<>(mapper, stream.spliterator()), stream.isParallel()).onClose(stream::close); }
spliterator()
ã¡ãœãããåŒã³åºããåŸã®ãœãŒã¹ã¹ããªãŒã ã¯ãäœ¿çšæžã¿ãã«ãªãããã以äžãã調çããããšã¯ã§ããŸããã ããããããã¯æ£åžžã§ããããã¯ãæ°ããæäœã远å ãããšãã«ãã¹ãŠã®äžéã¹ã¬ããã§çºçããŸãã 2ã€ã®ã¹ããªãŒã ãçµåãã
Stream.concatïŒïŒã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã
PairSpliterator
èªäœãèšè¿°ãã
PairSpliterator
ãŸãã
ãã€ã³ãã«è¡ããŸãããã
æãç°¡åãªããšã¯ã
characteristics()
ã¡ãœãããèšè¿°ããããšã§ãã äžéšã®ç¹æ§ã¯å
ã®ã¹ããªãã¿ãŒããç¶æ¿ãããŸãããNONNULLãDISTINCTãããã³SORTEDããªã»ããããå¿
èŠããããŸããä»»æã®ããããŒé¢æ°ã䜿çšããåŸã«ãããã®ç¹æ§ãä¿èšŒããããšã¯ã§ããŸããã
public int characteristics() { return source.characteristics() & (SIZED | SUBSIZED | CONCURRENT | IMMUTABLE | ORDERED); }
tryAdvance
ã¡ãœããã®å®è£
ã¯ãããªãåçŽã§ãªããã°ãªããŸããã å
ã®ã¹ããªãã¿ãŒããããŒã¿ãèªã¿åããäžéãããã¡ãŒã®åã®èŠçŽ ãèšæ¶ããæåŸã®ãã¢ã®
mapper
ãåŒã³åºãã ãã§ãã ã¹ããªãŒã ã®å
é ã«ãããã©ãããèŠããŠããã ãã®äŸ¡å€ããããŸãã ããŒã«å€æ°
hasPrev
ããã«åœ¹ç«ã¡ãåã®å€ããããã©ããã瀺ããŸãã
trySplit
ã¡ãœãã
trySplit
ããœãŒã¹ã¹ããªãã¿ãŒã§
trySplit
ãåŒã³åºãããšã§å®è£
ããã®
trySplit
æé©ã§ãã ããã§ã®äž»ãªå°é£ã¯ãå
ã®ã¹ããªãŒã ã®2ã€ã®åé¢ãããéšåã®ãžã£ã³ã¯ã·ã§ã³ã§ãã¢ãåŠçããããšã§ãã ãã®ãã¢ã¯ãååããã€ãã¹ããã¹ããªãã¿ãŒã§åŠçããå¿
èŠããããŸãã ãããã£ãŠãåŸåã®æåã®å€ãä¿åããæåŸã«éãããšãã«ãæåŸã®å€ãšãšãã«
mapper
ã«éä¿¡ããããšã§åã³åäœããå¿
èŠããããŸãã
ããã«å¯ŸåŠããåŸãã³ã³ã¹ãã©ã¯ã¿ãŒãäœæããŸãã
class PairSpliterator<T, R> implements Spliterator<R> { Spliterator<T> source; boolean hasLast, hasPrev; private T cur; private final T last; private final BiFunction<T, T, R> mapper; public PairSpliterator(BiFunction<T, T, R> mapper, Spliterator<T> source) { this(mapper, source, null, false, null, false); } public PairSpliterator(BiFunction<T, T, R> mapper, Spliterator<T> source, T prev, boolean hasPrev, T last, boolean hasLast) { this.source = source;
tryAdvance
ã¡ãœããïŒã©ã ãã䜿çšããŠå
ã®
tryAdvance
ã«æž¡ã代ããã«ãã»ãã¿ãŒãžã®ãªã³ã¯ã䜿çšïŒïŒ
void setCur(T t) { cur = t; } @Override public boolean tryAdvance(Consumer<? super R> action) { if (!hasPrev) {
ãããŠãããã«
trySplit()
ã¡ãœããããããŸãïŒ
public Spliterator<R> trySplit() { Spliterator<T> prefixSource = source.trySplit();
estimateSize()
ãèšè¿°ããããšã¯é£ãããããŸããããœãŒã¹ã¹ããªãã¿ãŒããã®ãµã€ãºãæšå®ã§ããå Žåã¯ããã©ã°ã確èªãã1ã€ãŸãã¯2ã€ã®ãŠãããã埮調æŽããã ãã§ãã
public long estimateSize() { long size = source.estimateSize(); if (size == Long.MAX_VALUE)
ãã®ãã©ãŒã ã§ã¯ããã®ã¹ããªãã¿ãŒ
ãç§ã®StreamExã©ã€ãã©ãªã«å
¥ããŸããã å¯äžã®éãã¯ãããªããã£ãåã®ããŒãžã§ã³ãäœæããå¿
èŠããã£ãããšã§ãããŸãã
pairMap
ã¯éçã¡ãœããã§ã¯ãããŸããã
ããã¯ãã¹ãŠéåžžã«é
ãããã§ããïŒ
ãã¹ãŠãé床ã§ããã»ã©æªãã¯ãããŸããã ããšãã°ãStackOverflowã®æ¬¡ã®
åé¡ãèããŠã¿ãŸããããæå®ããã
Integer
ã»ããããããããã«ç¶ãæ°ãããå°ãããã®ã ããæ®ããçµæãæ°ãããªã¹ãã«ä¿åããŸãã ã¿ã¹ã¯èªäœã¯éåžžã«åçŽãªã®ã§ãæéã®ããªãã®éšåããªãŒããŒãããã«è²»ããããŸãã 2ã€ã®çŽ æŽãªå®è£
ãææ¡ã§ããŸããã€ãã¬ãŒã¿ïŒä»»æã®ã³ã¬ã¯ã·ã§ã³ã§åäœããŸãïŒãšèŠçŽ çªå·ã«ããã¢ã¯ã»ã¹ïŒé«éã©ã³ãã ã¢ã¯ã»ã¹ã®ãªã¹ãã§ã®ã¿åäœããŸãïŒã§ãã ã€ãã¬ãŒã¿ïŒnaiveIteratorïŒã䜿çšããããªã¢ã³ãã¯æ¬¡ã®ãšããã§ãã
List<Integer> result = new ArrayList<>(); Integer last = null; for (Integer cur : input) { if (last != null && last < cur) result.add(last); last = cur; }
ãã ããã©ã³ãã ã¢ã¯ã»ã¹ïŒnaiveGetïŒã®å ŽåïŒ
List<Integer> result = new ArrayList<>(); for (int i = 0; i < input.size() - 1; i++) { Integer cur = input.get(i), next = input.get(i + 1); if (cur < next) result.add(cur); }
StreamExã©ã€ãã©ãªã䜿çšãããœãªã¥ãŒã·ã§ã³ã¯éåžžã«ã³ã³ãã¯ãã§ãã©ã®ããŒã¿ãœãŒã¹ïŒstreamExïŒã§ãæ©èœããŸãã
List<Integer> result = StreamEx.of(input).pairMap((a, b) -> a < b ? a : null).nonNull().toList();
ã³ã¡ã³ããŒã¿ãŒã¯ãããã«3ã€ã®å®çšçãªãœãªã¥ãŒã·ã§ã³ãææ¡ããŸããã åŸæ¥ã®å€ããå°ãªããæç¥šæ°ãæãå€ãã£ããããå
¥åæã«ã©ã³ãã ã¢ã¯ã»ã¹ãªã¹ããå¿
èŠã§ãïŒãã®ãœãªã¥ãŒã·ã§ã³ã¹ããªãŒã ãåŒã³åºããŸãããïŒã
List<Integer> result = IntStream.range(0, input.size() - 1).filter(i -> input.get(i) < input.get(i + 1)).mapToObj(input::get) .collect(Collectors.toList());
以äžã¯ã䞊ååïŒåæžïŒããªãå¯äœçšã䌎ãåæžã§ãã
List<Integer> result = new ArrayList<>(); input.stream().reduce((a, b) -> { if (a < b) result.add(a); return b; });
æåŸã®1ã€ã¯ã³ã¬ã¯ã¿ãŒã§ãããããã䞊åã§ã¯ãããŸããïŒã³ã¬ã¯ã¿ãŒïŒã
public static Collector<Integer, ?, List<Integer>> collectPrecedingValues() { int[] holder = { Integer.MAX_VALUE }; return Collector.of(ArrayList::new, (l, elem) -> { if (holder[0] < elem) l.add(holder[0]); holder[0] = elem; }, (l1, l2) -> { throw new UnsupportedOperationException("Don't run in parallel"); }); } List<Integer> result = input.stream().collect(collectPrecedingValues());
ã¹ããªãŒã ãšstreamExã®äžŠåããŒãžã§ã³ãæ¯èŒå¯Ÿè±¡ã«ãªããŸãã é·ãn = 10,000ã100,000ã1,000,000ã®èŠçŽ ã®ã©ã³ãã ãªæŽæ°ã®é
åã§å®éšãè¡ããŸãïŒçŽååãçµæã«ãªããŸãïŒã å®å
šãªJMHãã³ãããŒã¯ã³ãŒãã¯
ãã¡ãã§ãã ãã¹ãŠã®ã¢ã«ãŽãªãºã ãåãçµæã®é
åãçæããããšãæ€èšŒãããŸãã
枬å®ã¯ãã¯ã¢ããã³ã¢Core-i5ã§å®è¡ãããŸããã çµæã¯æ¬¡ã®ããã«ãªããŸãïŒæäœããšã«ãã€ã¯ãç§åäœã§ãã¹ãŠã®æéãå°ãªãæ¹ãè¯ãïŒïŒ
ã¢ã«ãŽãªãºã | n = 10,000 | n = 100,000 | n = 1,000,000 |
---|
naiveIterator | 97.7 | 904.0 | 10592.7 |
---|
ãã€ãŒã | 99.8 | 1084.4 | 11424.2 |
---|
ã³ã¬ã¯ã¿ãŒ | 112.5 | 1404.9 | 14387.2 |
---|
æžãã | 112.1 | 1139.5 | 12001.5 |
---|
ã¹ããªãŒã | 146.4 | 1624.1 | 16600.9 |
---|
streamEx | 115.2 | 1247.1 | 12967.0 |
---|
streamParallel | 56.9 | 582.3 | 6120.5 |
---|
streamExParallel | 53.4 | 516.7 | 5353.4 |
---|
pairMapïŒstreamExïŒãå«ãããŒãžã§ã³ã¯ãåŸæ¥ã®ã¹ããªãŒãã³ã°ããŒãžã§ã³ïŒstreamïŒãšã³ã¬ã¯ã¿ãŒãå«ãããŒãžã§ã³ã®äž¡æ¹ã远ãè¶ããŠããããšãããããŸãã åæã«ãstreamExã®ãã©ã¬ã«ããŒãžã§ã³ã¯ã¹ããªãŒã ã®ãã©ã¬ã«ããŒãžã§ã³ãããé«éã§ãããå°ããªããŒã¿ã»ããã§ãã£ãŠããã¹ãŠã®ã·ãªã¢ã«ããŒãžã§ã³ã倧å¹
ã«äžåããŸãã ããã¯ã
Stream Parallel Guidanceã®çµéšåãšäžèŽããŠããŸããå°ãªããšã100ãã€ã¯ãç§å®è¡ãããå Žåãã¿ã¹ã¯ã䞊ååããã®ã¯çã«ããªã£ãŠããŸãã
ç¬èªã®ã¹ããªãŒã ãäœæããå Žåã¯ãé©åãªã¹ããªãã¿ãŒã«å¿ããŠãã¿ã¹ã¯ã®äžŠååæ¹æ³ã«äŸåããããšã«æ³šæããŠãã ããã åå²ã«ç
©ããããããªãå Žåã¯ãã¹ããªãã¿ãŒããŸã£ããäœæããã«ããŠãŒãã£ãªãã£ã¡ãœããã䜿çšããŠãã ããã ãŸããæ¢åã®JDKæ©èœã䜿çšããŠã¹ããªãŒã ãäœæã§ããå Žåã¯ãæ°ããã¹ããªãã¿ãŒãäœæããªãã§ãã ããã åªããã¹ããªãã¿ãŒãããã°ãããã»ã©é£ãããªãã¿ã¹ã¯ã§ã䞊ååŠçã§é«éåã§ããŸãã