12

Click here to load reader

Hello, Guava ! samples

Embed Size (px)

DESCRIPTION

Sample codes of the presentation "Hello, Guava !" Its presentation is here. http://www.slideshare.net/akirakoyasu/hello-guava

Citation preview

Page 1: Hello, Guava ! samples

Guava-samples

Subject 0. プログラムの実行時間を測りましょう

Sample0A(JDK 版) ・・・・・・・・・ Page1

Sample0B(Guava 版) ・・・・・・・・・ Page2

Subject 1. コストの高い処理の結果をキャッシュしましょう

Sample1A(キャッシュ無し版) ・・・・・ Page3

Sample1B(JDK 版) ・・・・・・・・・ Page4

Sample1C(Guava 版) ・・・・・・・・・ Page5

Subject 2. あるリストを加工して別のリストを作りましょう

Sample2A(JDK 版) ・・・・・・・・・ Page6

Sample2B(Guava 版) ・・・・・・・・・ Page7

Subject 3. ファイルの内容を標準出力へ出力しましょう

Sample3A(JDK 版旧 io) ・・・・・・・・・ Page8

Sample3B(JDK 版nio) ・・・・・・・・・ Page9

Sample3C(Guava 版) ・・・・・・・・・ Page10

Copyright © 2012 Akira Koyasu Some rights reserved.

Page 2: Hello, Guava ! samples

Sample0A.java

1 ppaacckkaaggee guava.subject0;23 /**4 * Subject 0. プログラムの実行時間を測りましょう5 * JDK版6 * @@aauutthhoorr koyasu7 */8 ppuubblliicc ccllaassss Sample0A {9

10 ppuubblliicc ssttaattiicc vvooiidd main(String[] args) {1112 // システム時間13 lloonngg time1 = System.currentTimeMillis();1415 lloonngg sum = 0;16 ffoorr (iinntt i = 0; i < Integer.MAX_VALUE; i++) {17 sum += i;18 }1920 lloonngg time2 = System.currentTimeMillis();2122 System.out.printf("sum: %d%n", sum);23 // 引き算をします。24 System.out.printf("time: %d ms%n", time2 - time1);25 }26 }27

Page 1

koyasu
タイプライターテキスト
koyasu
タイプライターテキスト
koyasu
タイプライターテキスト
koyasu
タイプライターテキスト
koyasu
タイプライターテキスト
Page 3: Hello, Guava ! samples

Sample0B.java

1 ppaacckkaaggee guava.subject0;23 iimmppoorrtt com.google.common.base.Stopwatch;45 /**6 * Subject 0. プログラムの実行時間を測りましょう7 * Guava版8 * @@aauutthhoorr koyasu9 */

10 ppuubblliicc ccllaassss Sample0B {1112 ppuubblliicc ssttaattiicc vvooiidd main(String[] args) {1314 // ストップウォッチ!!15 Stopwatch stopwatch = nneeww Stopwatch().start();1617 lloonngg sum = 0;18 ffoorr (iinntt i = 0; i < Integer.MAX_VALUE; i++) {19 sum += i;20 }2122 stopwatch.stop();2324 System.out.printf("sum: %d%n", sum);25 System.out.printf("time: %s%n", stopwatch);26 }27 }28

Page 2

Page 4: Hello, Guava ! samples

Sample1A.java

1 ppaacckkaaggee guava.subject1;23 iimmppoorrtt java.math.BigInteger;45 iimmppoorrtt com.google.common.base.Stopwatch;67 /**8 * Subject 1. コストの高い処理の結果をキャッシュしましょう9 * キャッシュ無し版

10 * @@aauutthhoorr koyasu11 */12 ppuubblliicc ccllaassss Sample1A {1314 ppuubblliicc ssttaattiicc vvooiidd main(String[] args) {1516 Stopwatch stopwatch = nneeww Stopwatch().start();1718 BigInteger[] f;19 f = getFibonacci();20 f = getFibonacci();21 f = getFibonacci();2223 System.out.println(f[f.length - 1]);2425 System.out.printf("time: %s%n", stopwatch);26 }2728 /**29 * 20000個のフィボナッチ数を返す30 * @@rreettuurrnn31 */32 pprriivvaattee ssttaattiicc BigInteger[] getFibonacci() {33 ffiinnaall iinntt n = 20000;34 BigInteger[] f = nneeww BigInteger[n];3536 f[0] = BigInteger.ZERO;37 f[1] = BigInteger.ONE;38 ffoorr (iinntt i = 0; i < n - 2; i++) {39 f[i + 2] = f[i].add(f[i + 1]);40 }41 System.out.println("Calc fibonacci complete.");42 rreettuurrnn f;43 }44 }45

Page 3

Page 5: Hello, Guava ! samples

Sample1B.java

1 ppaacckkaaggee guava.subject1;23 iimmppoorrtt java.math.BigInteger;45 iimmppoorrtt com.google.common.base.Stopwatch;67 /**8 * Subject 1. コストの高い処理の結果をキャッシュしましょう9 * JDK版

10 * @@aauutthhoorr koyasu11 */12 ppuubblliicc ccllaassss Sample1B {1314 ppuubblliicc ssttaattiicc vvooiidd main(String[] args) {1516 Stopwatch stopwatch = nneeww Stopwatch().start();1718 BigInteger[] f;19 f = FibonacciCalculator.get();20 f = FibonacciCalculator.get();21 f = FibonacciCalculator.get();2223 System.out.println(f[f.length - 1]);2425 System.out.printf("time: %s%n", stopwatch);26 }2728 /**29 * 20000個のフィボナッチ数を返すクラス30 * @@rreettuurrnn31 */32 pprriivvaattee ssttaattiicc ccllaassss FibonacciCalculator {33 pprriivvaattee ssttaattiicc BigInteger[] f;3435 pprriivvaattee ssttaattiicc BigInteger[] get() {36 // キャッシュを自分で書くのが、良くない37 iiff (f == nnuullll) {38 ssyynncchhrroonniizzeedd (FibonacciCalculator.ccllaassss) {39 iiff (f == nnuullll) {40 ffiinnaall iinntt n = 20000;41 f = nneeww BigInteger[n];4243 f[0] = BigInteger.ZERO;44 f[1] = BigInteger.ONE;45 ffoorr (iinntt i = 0; i < n - 2; i++) {46 f[i+2] = f[i].add(f[i+1]);47 }48 System.out.println("Calc fibonacci complete.");49 }50 }51 }52 rreettuurrnn f;53 }54 }55 }56

Page 4

Page 6: Hello, Guava ! samples

Sample1C.java

1 ppaacckkaaggee guava.subject1;23 iimmppoorrtt java.math.BigInteger;45 iimmppoorrtt com.google.common.base.Stopwatch;6 iimmppoorrtt com.google.common.base.Supplier;7 iimmppoorrtt com.google.common.base.Suppliers;89 /**

10 * Subject 1. コストの高い処理の結果をキャッシュしましょう11 * Guava版12 * @@aauutthhoorr koyasu13 */14 ppuubblliicc ccllaassss Sample1C {1516 ppuubblliicc ssttaattiicc vvooiidd main(String[] args) {1718 Stopwatch stopwatch = nneeww Stopwatch().start();1920 BigInteger[] f;21 f = fibonacciSupplier.get();22 f = fibonacciSupplier.get();23 f = fibonacciSupplier.get();2425 System.out.println(f[f.length - 1]);2627 System.out.printf("time: %s%n", stopwatch);28 }2930 // 初回の計算結果をキャッシュするサプライヤー31 pprriivvaattee ssttaattiicc Supplier<BigInteger[]> fibonacciSupplier32 = Suppliers.memoize(nneeww Supplier<BigInteger[]>() {33 ppuubblliicc BigInteger[] get() {34 ffiinnaall iinntt n = 20000;35 BigInteger[] f = nneeww BigInteger[n];3637 f[0] = BigInteger.ZERO;38 f[1] = BigInteger.ONE;39 ffoorr (iinntt i = 0; i < n - 2; i++) {40 f[i+2] = f[i].add(f[i+1]);41 }42 System.out.println("Calc fibonacci complete.");43 rreettuurrnn f;44 }45 });46 }47

Page 5

Page 7: Hello, Guava ! samples

Sample2A.java

1 ppaacckkaaggee guava.subject2;23 iimmppoorrtt java.util.ArrayList;4 iimmppoorrtt java.util.Collections;5 iimmppoorrtt java.util.HashMap;6 iimmppoorrtt java.util.List;7 iimmppoorrtt java.util.Map;89 iimmppoorrtt com.google.common.base.Stopwatch;

1011 /**12 * Subject 2. あるリストを加工して別のリストを作りましょう13 * JDK版14 * @@aauutthhoorr koyasu15 */16 ppuubblliicc ccllaassss Sample2A {1718 // 元のリスト19 @SuppressWarnings("serial")20 pprriivvaattee ssttaattiicc List<Integer> srcList = nneeww ArrayList<Integer>(){{21 ffoorr (iinntt i = 0; i < 1000; i++) {22 add(Integer.valueOf(i));23 }24 }};2526 // マスタマップ(不変にする)27 @SuppressWarnings("serial")28 pprriivvaattee ssttaattiicc Map<Integer, String> map = Collections.unmodifiableMap(29 nneeww HashMap<Integer, String>(){{30 ffoorr (iinntt i = 0; i < 10000; i++) {31 put(Integer.valueOf(i), "[" + i + "]の値");32 }33 }});3435 ppuubblliicc ssttaattiicc vvooiidd main(String[] args) {36 System.out.printf("src[0]: %s%n", srcList.get(0));37 System.out.printf("map[0]: %s%n", map.entrySet().iterator().next());3839 Stopwatch stopwatch = nneeww Stopwatch().start();4041 List<String> dstList = nneeww ArrayList<String>(srcList.size());42 // ループして変換する43 ffoorr (Integer src : srcList) {44 String val = map.get(src);45 dstList.add(val);46 }4748 stopwatch.stop();4950 System.out.printf("dst[0]: %s%n", dstList.get(0));51 System.out.printf("time: %s%n", stopwatch);52 }53 }54

Page 6

Page 8: Hello, Guava ! samples

Sample2B.java

1 ppaacckkaaggee guava.subject2;23 iimmppoorrtt java.util.ArrayList;4 iimmppoorrtt java.util.List;5 iimmppoorrtt java.util.Map;67 iimmppoorrtt com.google.common.base.Function;8 iimmppoorrtt com.google.common.base.Functions;9 iimmppoorrtt com.google.common.base.Stopwatch;

10 iimmppoorrtt com.google.common.collect.ImmutableMap;11 iimmppoorrtt com.google.common.collect.Iterables;12 iimmppoorrtt com.google.common.collect.Lists;1314 /**15 * Subject 2. あるリストを加工して別のリストを作りましょう16 * Guava版17 * @@aauutthhoorr koyasu18 */19 ppuubblliicc ccllaassss Sample2B {2021 // 元のリスト22 @SuppressWarnings("serial")23 pprriivvaattee ssttaattiicc List<Integer> srcList = nneeww ArrayList<Integer>(){{24 ffoorr (iinntt i = 0; i < 1000; i++) {25 add(Integer.valueOf(i));26 }27 }};2829 // マスタマップ(不変にする)30 pprriivvaattee ssttaattiicc ffiinnaall Map<Integer, String> map;31 ssttaattiicc {32 ImmutableMap.Builder<Integer, String> builder33 = ImmutableMap.builder();34 ffoorr (iinntt i = 0; i < 10000; i++) {35 builder.put(Integer.valueOf(i), "[" + i + "]の値");36 }37 map = builder.build();38 }3940 ppuubblliicc ssttaattiicc vvooiidd main(String[] args) {41 System.out.printf("src[0]: %s%n", srcList.get(0));42 System.out.printf("map[0]: %s%n", Iterables.get(map.entrySet(), 0));4344 Stopwatch stopwatch = nneeww Stopwatch().start();4546 // 変換関数で変換47 List<String> dstList = Lists.transform(48 srcList, nneeww Function<Integer, String>(){49 @Override50 ppuubblliicc String apply(Integer input) {51 rreettuurrnn map.get(input);52 }});5354 stopwatch.stop();5556 System.out.printf("dst[0]: %s%n", dstList.get(0));57 System.out.printf("time: %s%n", stopwatch);5859 // 運が良ければこんな方法もある60 List<String> dstList2 = Lists.transform(61 srcList, Functions.forMap(map));6263 System.out.println();64 System.out.printf("dst2[0]: %s%n", dstList2.get(0));65 }66 }

Page 7

Page 9: Hello, Guava ! samples

Sample3A.java

1 ppaacckkaaggee guava.subject3;23 iimmppoorrtt java.io.BufferedInputStream;4 iimmppoorrtt java.io.FileInputStream;5 iimmppoorrtt java.io.IOException;67 iimmppoorrtt com.google.common.base.Stopwatch;89 /**

10 * Subject 3. ファイルの内容を標準出力へ出力しましょう11 * JDK版 旧io12 * @@aauutthhoorr koyasu13 */14 ppuubblliicc ccllaassss Sample3A {1516 ppuubblliicc ssttaattiicc vvooiidd main(String[] args) {17 String path = "/path/to/file.txt";1819 Stopwatch stopwatch = nneeww Stopwatch().start();20 BufferedInputStream is = nnuullll;21 ttrryy {22 is = nneeww BufferedInputStream(nneeww FileInputStream(path));23 // バッファを用意する24 bbyyttee[] buf = nneeww bbyyttee[0x1000];25 iinntt len;26 // 読み出したバイトを書き込み27 wwhhiillee ((len = is.read(buf)) >= 0) {28 System.out.write(buf, 0, len);29 }30 } ccaattcchh (IOException e) {31 e.printStackTrace();32 } ffiinnaallllyy {33 iiff (is != nnuullll) {34 ttrryy {35 is.close();36 } ccaattcchh (IOException e) {37 e.printStackTrace();38 }39 }40 }41 stopwatch.stop();4243 System.out.printf("time: %s%n", stopwatch);44 }45 }46

Page 8

Page 10: Hello, Guava ! samples

Sample3B.java

1 ppaacckkaaggee guava.subject3;23 iimmppoorrtt java.io.FileInputStream;4 iimmppoorrtt java.io.FileNotFoundException;5 iimmppoorrtt java.io.IOException;6 iimmppoorrtt java.nio.channels.Channels;7 iimmppoorrtt java.nio.channels.FileChannel;89 iimmppoorrtt com.google.common.base.Stopwatch;

1011 /**12 * Subject 3. ファイルの内容を標準出力へ出力しましょう13 * JDK版 nio14 * @@aauutthhoorr koyasu15 */16 ppuubblliicc ccllaassss Sample3B {1718 ppuubblliicc ssttaattiicc vvooiidd main(String[] args) {19 String path = "/path/to/file.txt";2021 Stopwatch stopwatch = nneeww Stopwatch().start();2223 FileChannel channel = nnuullll;24 ttrryy {25 // ファイルチャネルを使う(悪くない)26 channel = nneeww FileInputStream(path).getChannel();27 channel.transferTo(0, channel.size(),28 Channels.newChannel(System.out));2930 } ccaattcchh (FileNotFoundException e) {31 e.printStackTrace();32 } ccaattcchh (IOException e) {33 e.printStackTrace();34 } ffiinnaallllyy {35 iiff (channel != nnuullll) {36 ttrryy {37 channel.close();38 } ccaattcchh (IOException e) {39 e.printStackTrace();40 }41 }42 }434445 stopwatch.stop();4647 System.out.printf("time: %s%n", stopwatch);48 }49 }50

Page 9

Page 11: Hello, Guava ! samples

Sample3C.java

1 ppaacckkaaggee guava.subject3;23 iimmppoorrtt java.io.File;4 iimmppoorrtt java.io.IOException;56 iimmppoorrtt com.google.common.base.Stopwatch;7 iimmppoorrtt com.google.common.io.Files;89 /**

10 * Subject 3. ファイルの内容を標準出力へ出力しましょう11 * Guava版12 * @@aauutthhoorr koyasu13 */14 ppuubblliicc ccllaassss Sample3C {1516 ppuubblliicc ssttaattiicc vvooiidd main(String[] args) {17 String path = "/path/to/file.txt";1819 Stopwatch stopwatch = nneeww Stopwatch().start();20 ttrryy {21 // コピー!!22 Files.copy(nneeww File(path), System.out);23 } ccaattcchh (IOException e) {24 e.printStackTrace();25 }26 stopwatch.stop();2728 System.out.printf("time: %s%n", stopwatch);29 }30 }31

Page 10

Page 12: Hello, Guava ! samples

This work is licensed under the Creative Commons Attribution-NonCommercial 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/3.0/.

Notes