ãã¦ãJava8ã§é¢æ°åã£ã½ããã¨ããã£ã¦éãã§ã¿ãããã§ãããå®éã¯ãããªæ¸ãæ¹ãã¾ããããã
Java8ã§å®éã«ä½¿ãã®ã¯ãStreamã§ãã
ã¨ãããã¨ã§ãStreamã®ä½¿ãæ¹ãã²ã¨ã¨ããè¦ã¦ã¿ã¾ãã
â»5/17 仿§å¤æ´ããã£ãã®ã§ãä¿®æ£ãã¾ãã
åºæ¬
ã¾ãã¯ãIterableã¤ã³ã¿ãã§ã¼ã¹ã«ç¨æãããforEachã¡ã½ãããè¦ã¦ã¿ã¾ãããã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); names.forEach(s -> System.out.println(s));
ããã§æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãã
ãã¾ã¾ã§ã®æ¡å¼µforã ã¨æ¬¡ã®ããã«æ¸ãã¦ã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); for(String s : names){ System.out.println(s); }
ããã§ä½ãããã©ãããã£ããã¨ããã¨ãnamesãæ ¼ç´ãã¦ãåStringããforã®ãã¨ã«æ¸ããªãã¨ãããªãã£ããã§ãããå
ã«è¦ç´ ã®åãæ¸ãã®ã§ãIDEã§ã®è£å®ãããã¾ããã
Lambdaæ§æã§ã¯åæ¨è«ãè¡ã£ã¦ãããã®ã§ãããããListãæ ¼ç´ãã¦ãã¨ããã£ã¦ããåãæ¸ãå¿
è¦ãããã¾ãããããã¯ãªããªã便å©ã§ãã
ã¾ããä»åã®ããã«ãå¤ããã®ã¾ã¾å¥ã®ã¡ã½ããã«æ¸¡ãã¨ããå ´åã«ã¯ã¡ã½ããåç §ã使ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); names.forEach(System.out::println);
streamãã¦mapãfilter
ãã¦ãä¸è¨ã®forEachã¯ããã¹ã¦ã®å¤ã«ãããã¦ãã®ã¾ã¾å¦çãããå ´åã«ã¯ä½¿ããã®ã§ãããå®éã«ã¯å¤ãå å·¥ããããæ¡ä»¶ã«ãã£ã¦å¦çããå¤ãçµã£ããã¨ãããã¨ãå¿
è¦ã«ãªãã¾ãã
ãã®ãããªå ´åãJava8ã§ã¯Listãªã©ãstreamã«å¤æãã¦å¦çããå¿
è¦ãããã¾ãã
ãã¨ãã°ãå¤ãå å·¥ããå ´åã«ã¯mapã¡ã½ããã使ã£ã¦æ¬¡ã®ããã«ãªãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); names.stream() .map(s -> "[" + s + "]") .forEach(System.out::println);
ããã§æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãã
æ¡ä»¶ã«ãã£ã¦å¦çããå¤ãçµãå ´åã¯æ¬¡ã®ããã«filterã¡ã½ããã使ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); names.stream() .filter(s -> s.length() > 5) .map(s -> "[" + s + "]") .forEach(System.out::println);
ããããã¨ãé·ãã5æåããé·ãå¤ã ããã[ã]ãã§å²ã¾ãã¦è¡¨ç¤ºããã¾ãã
ã³ã¬ã¯ã·ã§ã³ã®å¤å®
ããã°ã©ã ãæ¸ãã¦ããã¨ãã³ã¬ã¯ã·ã§ã³ã®ãã¹ã¦ã®è¦ç´ ãæ¡ä»¶ãã¿ããã¦ããã¨ããéã«æ¡ä»¶ãã¿ãããè¦ç´ ãã²ã¨ã¤ããªããã¨ããã²ã¨ã¤ã§ããããã¨ããå¤å®ãããã¨ãããã¾ãã
Java7ã¾ã§ã§ã¯ããã©ã°ãç¨æãã¦ã«ã¼ããã¾ããã¦ã¨ããã©ããªè¨è¿°ãå¿
è¦ã§ããããstreamã«ã¯ç°¡åã«å¤å®ã§ããã¡ã½ãããç¨æããã¦ãã¾ãã
ãã¹ã¦ã®è¦ç´ ãæ¡ä»¶ãã¿ããã¦ãããã©ããå¤å®ããå ´åã«ã¯allMatchã¡ã½ããã使ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); System.out.println( names.stream().allMatch(s -> !s.isEmpty()); //true
ã²ã¨ã¤ã§ãæ¡ä»¶ãæºããè¦ç´ ããããã©ããå¤å®ããã«ã¯anyMatchã¡ã½ããã使ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); System.out.println( names.stream().anyMatch(s -> s.length > 7); //true
æ¡ä»¶ãæºããè¦ç´ ãã²ã¨ã¤ããªããã¨ãå¤å®ããã«ã¯noneMatchã¡ã½ããã使ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); System.out.println( names.stream().noneMatch(s -> s.startWith("A")); //true
ã³ã¬ã¯ã¿ã¼
streamããã²ã¨ã¤ã®ãªãã¸ã§ã¯ããå¾ãå ´åã«ä½¿ããã®ãã³ã¬ã¯ã¿ã¼ã§ãã
ãã¨ãã°ããã¹ã¦ã®æååãé£çµããæååãå¾ãã«ã¯ãtoStringJoinerã³ã¬ã¯ã¿ã¼ã使ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); System.out.println( names.stream.collect(Collectors.toStringJoiner(":")) );
次ã®ããã«ããã¨ãæåæ°ã®åè¨ãã¨ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); System.out.println( names.stream.collect(Collectors.sumBy(s -> (long)s.length()) ); // 28
sumByã§ã¯Longå¤ãã¨ãã®ã§ãlongåã«ãã£ã¹ããã¦ãããã¨ã«æ³¨æãå¿ è¦ã§ãã
å®éã«ã¯ãæ°å¤ãåè¨ããã¨ãå¹³åãã¨ãå ´åã«ã¯ãIntStreamã«å¤æããã»ãã便å©ã§ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); System.out.println( names.stream.mapToInt(s -> s.length()).sum()); //28
streamãListã«å¤æããå¿
è¦ããããã¨ãå¤ãã¨æãã¾ããããã®å ´åã«ã¯toListã³ã¬ã¯ã¿ã¼ã使ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); List<String> converted = names.stream() .filter(s -> s.length() > 5) .map(s -> "(" + s + ")") .collect(Collectors.toList()); System.out.println(converted); // [(hoge hoge), (foo bar), (kishida)]
便å©ãããªã®ãgroupingByã³ã¬ã¯ã¿ã¼ã§ããgroupingByã§å¾ãå¤ããã¼ã«ãã¦ãå¤ãæ ¼ç´ããListãå²ãå½ã¦ãMapã使ããã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); names.stream() .collect(Collectors.groupingBy(s -> s.length())) .forEach((k,v) -> System.out.println(k + ":" + v));
ããã¯æ¬¡ã®ããã«ãªãã¾ãã
ãã¡ã¤ã«ã¨Stream
ããããã¾ã¾ã§ããã¡ã¤ã«ãæ±ãã«ã¯InputStreamãOutputStreamã使ã£ã¦ãããã§ããããã£ã¡ã®Streamãããªãã¦ãä»å話é¡ã«ãã¦ãStreamã¨ã®é¢ä¿ã§ãã
Streamã¨ããã°ãã³ã¬ã¯ã·ã§ã³ã§ã®å©ç¨ã注ç®ãããã®ã§ãããBufferedReaderã«ãStreamãè¿ãlinesã¨ããã¡ã½ããã追å ããã¦ãã¦å°å³ã«ä¾¿å©ã§ãã
ä¾ãã°ã次ã®ãããªlines.txtã¨ãããã¡ã¤ã«ããã¹ã¯ãããã«ããã¨ãã¾ãã
SCREEN 2; FOR I=0 TO 100 LINE (RND(1)*128,RND(1)*96)-(RND(1)*128+128,RND(1)*96+96),15 NEXT I GOTO 50
ããã表示ãããã¨ããã¨ã次ã®ããã«ãªãã¾ãã
String path="C:\\User\\naoki\\Desktop\\lines.txt"; try(FileReader fr = new FileReader(path); BufferedReader br = new BufferedReader(fr)) { br.lines() .forEach(System.out::println); }catch(IOException ex){}
ä»åã¯ãµã³ãã«ãªã®ã§è¡æ°ã®çããã¡ã¤ã«ã§ãããä¸è¬ã«ã¯ãã¡ã¤ã«ã®è¡æ°ã¯ãããã«è¡¨ç¤ºããã«ã¯çµæ§é·ãã®ã§ãæåã®10è¡ãªã©ã表示ããããªãã¾ãããã®å ´åããã¾ã¾ã§ã¯ã¡ãã£ã¨ã¾ãããã©ãã³ã¼ããå¿
è¦ã«ãªã£ã¦ãã¾ããããstreamã«ãªãã¨ã表示é¨ã次ã®ããã«ããã ãã§ãã
br.lines()
.limit(10)
.forEach(System.out::println);
ã¨ããã§ãBufferedReaderã®ãµã³ãã«ã¨ãã¦ãã¡ã¤ã«ãèªã¿è¾¼ã¿ã¾ããããå®éã®ãã¡ã¤ã«ã®è¡¨ç¤ºã®å ´åã«ã¯ãFilesã¯ã©ã¹ã®readAllLinesã¡ã½ããã使ãã¾ãã
String path="C:\\User\\naoki\\Desktop\\lines.txt"; try{ Files.readAllLines(Paths.get(path), Charset.defaultCharset()).stream() .limit(10) .forEach(System.out::println); }catch(IOException ex){}
zipã§ãµãã¤ã®Streamãçµ±åãã
ããã°ã©ã ãçµãã§ããã¨ããµãã¤ã®Listã®åãä½ç½®ã®å¤ãçµ±åãã¦å¦çããã¨ãããã¨ãããã¾ã«å¿
è¦ã«ãªãã¾ãããStreamã使ã£ã¦ããã¨ããµãã¤ã®Streamãçµ±åãããã¨ãããã¨ãå¤ããªãã¾ãã
ããã§ä½¿ããã®ããStreamsã¯ã©ã¹ã®zipã¡ã½ããã§ãã
â» 2017/3/23 è¿½è¨ zipã¡ã½ããã¯Java 8ã«ã¯å
¥ãã¾ããã§ãã
ä¾ãã°æ¬¡ã®ããã«ä½¿ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); List<Integer> indexes = Arrays.asList(10, 20, 30, 40); Streams.zip(indexes.stream(), names.stream(), (idx, line) -> String.format("%3d %s", idx, line)) .forEach(System.out::println);
çµæã¯æ¬¡ã®ããã«ãªãã¾ãã
ãã®ãããªå ´åãIntStream.rangeã使ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); //Streams.zip(Streams.intRange(10, 50, 10).boxed(), Streams.zip(IntStream.range(10, 50, 10).boxed(), names.stream, (idx, line) -> String.format("%3d %s", idx, line)) .forEach(System.out::println);
IntStream.rangeã®ï¼çªç®ã®å¼æ°ã¯ãçµäºå¤ã§ã¯ãªãããã®å¤ããå°ããå¤ã¾ã§ãçæãããã®ã§æ³¨æãå¿
è¦ã§ãã
ç¡éã¹ããªã¼ã
ã¨ããã§ãä»åã¯namesã®è¦ç´ æ°ãããã£ã¦ããã®ã§ããããããç¯å²ã決ããIntStreamãç¨æãããã¨ãã§ãã¾ãããããã©ãããã¡ã¤ã«ããèªã¿è¾¼ãã Streamã¨å¯¾å¿ã¥ããå ´åãªã©ã¯ãè¦ç´ æ°ãããã¤ãããããããªãã®ã§ããããããç¯å²ã決ãã¦ãããã¨ãã§ãã¾ããããã¡ãããé常ã«å¤§ããªæ°å¤ãç¯å²ã¨ãã¦è¨å®ãã¦ããã°ããã®ã§ãããã¡ãã£ã¨ãã£ãæªãã§ãã
ããã§ä½¿ããã®ãç¡éã¹ããªã¼ã ã§ãã
次ã®ããã«ãlimitãªã©ã¨çµã¿åããã¦ä½¿ãã¾ãã
//Streams.iterate(10, i -> i + 10).limit(5).forEach(System.out::println); Stream.iterate(10, i -> i + 10).limit(5).forEach(System.out::println);
ãã®ãããªè¡¨ç¤ºã«ãªãã¾ãã
10
20
30
40
50
zipã¡ã½ããã¯ã©ã¡ããã®Streamãçµããã°å¦çãçµããã®ã§ãæéãªStreamã¨ç¡éã¹ããªã¼ã ãçµã¿åãããã¨ä¾¿å©ã§ããããããã¨ããã¡ã¤ã«ããèªã¿è¾¼ãã Streamã¨ã®çµåãè¦ç´ æ°ãæ°ã«ãããã¨ãªã次ã®ããã«æ¸ãã¾ãã
String path="C:\\User\\naoki\\Desktop\\lines.txt"; try{ Streams.zip( //Streams.iterator(10, idx -> idx + 10), Stream.iterate(10, idx -> idx + 10), Files.readAllLines(Paths.get(path), Charset.defaultCharset()).stream(), (idx, line) -> String.format("%3d %s", idx, line)) .forEach(String.out::println); }catch(IOException ex){}
次ã®ãããªè¡¨ç¤ºã«ãªãã¾ãã
10 SCREEN 2;
20 FOR I=0 TO 100
30 LINE (RND(1)*128,RND(1)*96)-(RND(1)*128+128,RND(1)*96+96),15
40 NEXT I
50 GOTO 50
ãã¨ãç¡éã¹ããªã¼ã ã§ã¯æ¬¡ã®ãããªéã³ããããã¨ãå¤ãã§ããã
//Streams.iterate(321, i -> (i * 211 + 2111) % 1999) Stream.iterate(321, i -> (i * 211 + 2111) % 1999) .limit(10) .forEach(System.out::println);
ã©ã³ãã ã£ã½ãå¤ãåºåããã¾ãã
321
1876
146
933
1073
ç·å½¢ååæ³ã¨ããã¢ã«ã´ãªãºã ã§ã®ä¹±æ°çæã§ãã
flatMap
ããã¤ãã®ãªã¹ããçµã¿åããã¦ã²ã¨ã¤ã®ãªã¹ããä½ãããå ´åã«ä½¿ããã®ãflatMapã§ãã
ãã¨ãã°ãè¦ç´ ã®æååãã¹ãã¼ã¹ã§åå²ãã¦ãããããè¦ç´ ã¨ãããªã¹ããä½ããã¨ããå ´åã«ã¯æ¬¡ã®ããã«æ¸ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); names.stream() .flatMap(s -> Arrays.stream(s.split(" "))) .forEach(System.out::println);
次ã®ãããªè¡¨ç¤ºã«ãªãã¾ãã
reduceã§ã²ã¨ã¤ã«ã¾ã¨ãã
ããã¾ã§ã§ããã¨ãã°anyMatchã¡ã½ãããã³ã¬ã¯ã¿ã¼ãªã©ãStreamã®å¤ãã¾ã¨ãã¦ã²ã¨ã¤ã®å¤ãè¿ãã¡ã½ãããããã¾ããã
ãã®ãããªã¡ã½ãããä¸è¬åãããã®ãreduceã¡ã½ããã§ãã
ãã¨ãã°ãanyMatchã¡ã½ãããreduceã¡ã½ããã§ç½®ãæããã¨æ¬¡ã®ããã«æ¸ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); System.out.println( names.stream().map(s -> s.length > 7).reduce((l, r) -> l || r).get() );
æ»ãå¤ã¯Optionalåã«ãªã£ã¦ããã®ã§ãgetãorElseã¡ã½ããã使ã£ã¦å¤ãåãåºãå¿
è¦ãããã¾ãã
ãã¡ãããanyMatchã¡ã½ããã¯trueãæåã«æ¥ãæç¹ã§å¦çãæã¡åãã¯ãã§ãããçµæã¨ãã¦ã¯åããã®ã«ãªãã¾ãã
ã¨ããã§ãreduceã¡ã½ããã¯å¼æ°ã1ã¤ã¨ããã®ã2ã¤ã¨ããã®ã3ã¤ã¨ããã®ãããã¾ãã弿°ã1ã¤ã¨ããã®ã¯ãµã³ãã«ãããã¾ãããã2ã¤ã¨ããã®ãã»ã¼åæ§ã®æ¸ãæ¹ã«ãªãã¾ããæ»ãå¤ã¯Optionalã§ã¯ãªãå¤ãç´æ¥è¿ãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); System.out.println( names.stream().map(s -> s.length > 7).reduce(false, (l, r) -> l || r) );
ããã§reduceã¡ã½ããã®æåã®å¼æ°ã«ã¯ããåä½å
ãã¨ãªããã®ãæå®ããå¿
è¦ãããã¾ãããåä½å
ãã¨ããã®ã¯ãç¶ãæ¼ç®ã®çæ¹ã®å¼æ°ã«ä¸ããã¨ããããçæ¹ã®å¼æ°ããã®ã¾ã¾è¿ããããªå¤ã§ãã
ãã¨ãã°ãè¶³ãç®ã®å ´åã¯ï¼ãåä½å
ã«ãªãã¾ããæãç®ã®å ´åã¯1ãåä½å
ã«ãªãã¾ããããã§ã¯è«çåã®oræ¼ç®ãè¡ã£ã¦ããã®ã§ãfalseãåä½å
ã«ãªãã¾ãã
åé¡ã¯å¼æ°ã3ã¤ã¨ãreduceã¡ã½ããã§ãããã¯å°ãä½¿ãæ¹ã«æ°ãã¤ããå¿
è¦ãããã¾ãã
å
ã»ã©ã®ä¾ã弿°ï¼ã¤ã®reduceã¡ã½ããã§æ¸ãæããã¨æ¬¡ã®ããã«ãªãã¾ãã
List<String> names = Arrays.asList("hoge hoge", "foo bar", "naoki", "kishida"); System.out.println( names.stream() .reduce( false, (ident, value) -> ident || value.length > 7, (left, right) -> left || right));
弿°ï¼ã¤ã®reduceã¡ã½ããã®æåã®å¼æ°ã«ã¯ã弿°ï¼ã¤ã®ã¨ãã¨åããåä½å
ãæ¸¡ãã¾ãã
ï¼ã¤ç®ã®ã¡ã½ããã«ã¯ãéä¸éç¨ã®ãªãã¸ã§ã¯ãã¨Streamã®è¦ç´ ãªãã¸ã§ã¯ããæ¸¡ãããã®ã§ããããããæ°ããªéä¸éç¨ãçæãã¾ããããã§ã渡ãããéä¸éç¨ã®ãªãã¸ã§ã¯ãã®ç¶æ
ãå¤ãã¦ã¯ããã¾ããã
ï¼ã¤ç®ã®ã¡ã½ããã«ã¯ãéä¸éç¨ã®ãªãã¸ã§ã¯ããï¼ã¤æ¸¡ãããã®ã§ããããããæ°ããªéä¸éç¨ãè¿ãã¾ãã
ãã®ãï¼ã¤ç®ã®å¼æ°ã¨ï¼ã¤ç®ã®å¼æ°ã¯ãã»ã¼åãæ¼ç®ã«ãªãã¾ãã
å®éã«ã¯ãé常ã®Streamãæ¸¡ãããã¨ãã«ã¯ã3ã¤ç®ã®å¼æ°ãå¼ã³åºããããã¨ã¯ãªãããã§ãã
åé¡ã¯ãparallelStreamã¡ã½ããã使ã£ã¦ä¸¦è¡Streamã«å¯¾ãã¦å¼æ°ï¼ã¤ã®reduceã¡ã½ãããå¼ã³åºãããã¨ãã§ããã®ã¨ãã¯ã¾ã第ä¸å¼æ°ã®å¤ã¨åè¦ç´ ã第äºå¼æ°ã«æ¸¡ããã¾ãã
ãµãã¤ã®è¦ç´ ãå¦çãããã¨ãï¼ã¤ãã®è¦ç´ ã®å¦çã¨ä¸¦è¡ãã¦ã第ä¸å¼æ°ã®å¦çãèµ°ãã¾ãã
ãã®ããã«ãé常ã®Streamã¨ä¸¦è¡Streamã§å¼ã³åºããæ¹ãéãã®ã§ãä½¿ãæ¹ã«æ°ãã¤ãã¦ããªãã¨ãé常ã®Streamã§ã¯æ£å¸¸ã«åä½ããã®ã«ä¸¦è¡Streamã§ã¯æ£ããåããªãã¨ãããã¨ã«ãªãã¾ãã
ãã ãã³ã¬ã¯ã¿ã¼ã便å©ãªã®ã§ããã¾ãåºçªããªãæ°ããã¾ãã
ã¾ã¨ã
ã¯ããªãªã¼ã¹ãã¦ã
Javaã«ãã颿°åããã°ã©ãã³ã° âJava 8ã©ã ãå¼ã¨Stream
- ä½è : Venkat Subramaniam,æ ªå¼ä¼ç¤¾ããã°ã©ãã³ã°ã·ã¹ãã 社
- åºç社/ã¡ã¼ã«ã¼: ãªã©ã¤ãªã¼ã¸ã£ãã³
- çºå£²æ¥: 2014/10/24
- ã¡ãã£ã¢: åè¡æ¬ï¼ã½ããã«ãã¼ï¼
- ãã®ååãå«ãããã° (3ä»¶) ãè¦ã
