CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

2015-01-01から1ヶ月間の記事一覧

第3章 ラムダ式を使ったプログラミング : 問題 3 : アサーション

問題 3 Java 1.4 は、予約語assertでもって Java 言語にアサーションを追加した。 なぜアサーションは、ライブラリの機能として提供されなかったのか? 解答 当時の Java では遅延実行を実現できなかったため。 メソッド呼び出しにすると、呼び出し時点で条件…

第3章 ラムダ式を使ったプログラミング : 問題 2 : ReentrantLock

問題 2 java.util.concurrent.locksのReentrantLockを使用する場合には、次のイデオムでロックとアンロックをする必要がある。 myLock.lock(); try { 何らかの処理 } finally { myLock.unlock(); } 次のように呼び出すことができるwithLockメソッドを提供せ…

第3章 ラムダ式を使ったプログラミング : 問題 1 : 遅延ロギング

問題 1 条件的なロギングを提供することで、遅延ロギング技法を強化せよ 典型的な呼び出しは logIf(Level.FINEST, () -> i == 10, () -> "a[10] = " + a[10]) となる。 ロガーがメッセージをロギングしないときは、その条件も評価しないようにせよ 解答 ■ 遅…

第3章 ラムダ式を使ったプログラミング

この章は、ラムダ式と関数型インターフェースを活用する独自のライブラリの作成方法を説明している。 私は “第1章 ラムダ式とは” で、Java におけるラムダ式は 関数型インターフェースの匿名クラスの便利な記述方法 にすぎないと述べた。 でも、ラムダ式を使…

第2章 ストリーム API の使い方 : 問題 12, 13 : 並列ストリーム

問題 12 短い単語の数をカウントする処理 Stream<String> words = ~; int[] shortWords = new int[12]; words.parallel() .forEach(s -> { if (s.length() < 12) shortWords[s.length()]++; }); は、競合が起こり正しくカウントできない。 shortWordsをAtomicIntege</string>…

第2章 ストリーム API の使い方 : 問題 11 : ストリームの処理結果を ArrayList に収集

問題 11 単一のArrayListがストリームと同じ大きさで生成されている場合、複数のArrayListをマージしないで、そのArrayListに結果を並行して収集できるはずである。 なぜなら、互いに異なる位置に並行して行うset操作なら、スレッドセーフになるからである。…

第2章 ストリーム API の使い方 : 問題 10 : reduce メソッドで平均の計算

問題 10 Stream<Double>の平均を計算するために利用できるreduceの呼び出しを書け 解答 Stream<Double> stream = Stream.of(1.0, 2.0, 3.0, 4.0); とします。 本来はreduceメソッドを使わないで stream.collect(Collectors.averagingDouble(Double::doubleValue)); とするの</double></double>…

第2章 ストリーム API の使い方 : 問題 9 : reduce メソッドのバリエーション

問題 9 Stream<ArrayList<T>>内の全ての要素を、ひとつのArrayList<T>にまとめよ 3つの Overload されたreduceを用いよ 解答 List<ArrayList<String>> listOfListが与えられているとする。 ■T reduce(T, BinaryOperator<T>) ArrayList<String> list = listOfList.stream() .reduce( new ArrayList<String>(), (r, e</string></string></t></arraylist<string></t></arraylist<t>…

第2章 ストリーム API の使い方 : 問題 8 : Stream から Stream を生成

問題 8 public static Stream<T> zip(Stream<T> first, Stream<T> second) を作成せよ このメソッドは、first と second から交互に要素を取り出し、どちらかのストリームの要素がなくなったら停止する 解答 いや~、この練習問題は難しかった。 一応、確認プログラム</t></t></t>…

第2章 ストリーム API の使い方 : 問題 7 : この Stream は有限か?

問題 7 上司に、Streamが有限かどうかを調べる public static <T> boolean isFinite(Stream<T> stream) メソッドを作成するように要請された。 このメソッドを実装せよ 解答 まず、メソッドのコードは以下のようになる。 public static <T> boolean isFinite(Stream<T> s</t></t></t></t>…

第2章 ストリーム API の使い方 : 問題 6 : Stream の効率的な生成

問題 6 文字列からCharacterのストリームを生成するメソッドがある。 public static Stream<Character> characterStream(String s) { List<Character> result = new ArrayList<>(); for (char c : s.toCharArray()) result.add(c); return result.stream(); } このメソッドでは、最</character></character>…

第2章 ストリーム API の使い方 : 問題 5 : iterate メソッドによる Stream の生成

問題 5 Stream.iterateを使って乱数の無限ストリームを生成せよ このときMath.randomを呼び出すのではなく、線形合同生成機(Linear Congruential Generator)を直接実装すること 解答 public static LongStream random(long seed) { final long a = 252149039…

第2章 ストリーム API の使い方 : 問題 4 : IntStream の生成

問題 4 整数の配列valuesがある。 int[] values = { 1,4,9,16 }; Stream.of(values) は何になるか? 解答 整数の配列をひとつだけ返すStream<int[]>になる。 さらに問題 ではvaluesからintのストリームを生成するにはどうすればよいか? 解答 IntStream.of(values)を</int[]>…

第2章 ストリーム API の使い方 : 問題 3 : 並列ストリーム

問題 3 ストリーム API で書いた、長い単語の数を求める処理 long count = words.stream() .filter(w -> w.length() > 12) .count(); でstreamではなくparallelStreamを使って並列でカウントした場合の速度の違いを計測せよ 解答 ■ 計測用のコード long star…

第2章 ストリーム API の使い方 : 問題 2 : limit メソッド

問題 2 長い単語のうち最初の5個だけ求める処理を、ストリーム API を使って以下のように書いた。 words.stream() .filter(w -> w.length() > 12) .limit(5) .forEach(System.out::println); この処理で、5番目の長い単語が見つかったらlimitメソッドの前の…

第2章 ストリーム API の使い方 : 問題 1 : ストリーム API を使わないで並列処理

問題 1 長い単語を数える処理を以下のようにforループで行った List<String> words = 〜; int count = 0; for (String w : words) { if (w.length() > 12) count++; } これの並列バージョンを書け 解答 ストリーム API を使えば、ものすごく簡単に書けるのに… まあ挑</string>…

第2章 ストリーム API の使い方

まず、プログラマーの皆様に訴えたいのは、ストリーム API とはラムダ式を活かすために導入された Framework であるということ … 怒り新党の新三大みたいだけど もしラムダ式だけなら、ComparatorやFileFilterやActionListenerが手軽に書けるぐらいである。 …

第1章 ラムダ式とは : 問題 12 : インターフェースのデフォルトメソッド追加の安全性

問題 12 インターフェースにメソッドを追加することは、デフォルトメソッドであれば問題ない(はず…) インターフェースへのデフォルトメソッドの追加は、どれぐらい安全か? Collectionインターフェースの新たなstreamメソッドのせいで、古いコードのコンパ…

第1章 ラムダ式とは : 問題 11’ : インターフェースとクラスの抽象, デフォルト, 静的メソッド

問題 11’ void f()メソッドを持つインターフェース I とスーパークラス S があり、その両方をインプリメントかつ拡張しているクラス T がある fメソッドが、抽象, デフォルト/標準, 静的の全ての組み合わせ(9通り)で何が起こるかを確かめよ 解答 ■ コンパ…

第1章 ラムダ式とは : 問題 11 : インターフェースの抽象, デフォルト, 静的メソッド

問題 11 void f()メソッドを持つ二つのインターフェース I, J があり、その両方をインプリメントしているクラス T がある fメソッドが、抽象, デフォルト, 静的の全ての組み合わせ(6通り)で何が起こるかを確かめよ 解答 ■ コンパイル結果の意味 ○ : T でf(…

第1章 ラムダ式とは : 問題 10 : Collections クラスのメソッドをインターフェースに追加

問題 10 あなたが Java の設計者で Collections Framework を自由に変更できるとしたら、 Collectionsクラスのメソッドをどのインターフェースに入れるのが良いかを考えよ そのとき、そのメソッドをデフォルトメソッドとするか静的メソッドにするかも述べよ …

第1章 ラムダ式とは : 問題 9 : デフォルトメソッド

問題 9 CollectionのサブインターフェースCollection2を作成して、デフォルトメソッド void forEachIf(Consumer<T> action, Predicate<T> filter) を追加せよ このメソッドは、filterがtrueを返した個々の要素に対してactionを適用する 解答 Collection2インターフ</t></t>…

第1章 ラムダ式とは : 問題 8 : ラムダ式とクロージャ

問題 8 ラムダ式が次のような拡張forループ内の値をキャプチャした場合、 String[] names = { "Peter", "Paul", "Mary" }; List<Runnable> runners = new ArrayList<Runnable>(); for (String name : names) { runners.add(() -> System.out.println(name)); } これらを実行する</runnable></runnable>…

第1章 ラムダ式とは : 問題 7 : 二つのラムダ式を続けて実行

問題 7 staticメソッドandThenを書け andThenメソッドは、二つのRunnableインターフェースをパラメータとして受け取り、最初のRunnableを実行した後に二つ目のRunnableを実行するRunnableを返す そしてandThenメソッドを呼び出すメインメソッドでは、二つの…

第1章 ラムダ式とは : 問題 6 : ラムダ式でチェック例外を隠す

問題 6 Runnableのrunメソッドはチェック例外をスローできないため、ラムダ式で簡潔に表すには不便なことが多い。 例えば、以下はコンパイルエラーになってしまう。 new Thread(() -> { System.out.println("Zzz"); Thread.sleep(1000); //← InterruptedExce…

第1章 ラムダ式とは : 問題 5 : 旧バージョンをラムダ式で書き換える

問題 5 自分のプロジェクトの一つから、ActionListenerやRunnableといったインターフェースを多く使っているファイルを一つ選び、それをラムダ式で置き換えよ その結果 コードが何行短くなったか? コードは読みやすくなったか? メソッド参照を使うことができ…

第1章 ラムダ式とは : 問題 4 : 複雑な Comparator をラムダ式で書く

問題 4 Fileの配列が与えられたとき、その配列をディレクトリ, ファイルの順に(ディレクトリ, ファイルの各々ではパス名で)ソートする処理をラムダ式を使って書け 解答 Windows の Explorer のような表示順ってことだね。 File[] files = { 〜 }; Arrays.s…

第1章 ラムダ式とは : 問題 3 : キャプチャされる変数

問題 3 FileクラスのlistFiles(FilenameFilter)メソッドを使って、指定されたディレクトリの下にある指定された拡張子の全てのファイルを返すメソッドをラムダ式を使って書け 解答 ■ 指定されたファイルを返すメソッド public static File[] getFiles(String…

第1章 ラムダ式とは : 問題 2 : ラムダ式とメソッド参照

問題 2 FileクラスのlistFiles(FileFilter)メソッドとisDirectoryメソッドを使って、指定されたディレクトリの下の全てのサブディレクトリを返すメソッドをラムダ式およびメソッド参照を使って書け 解答 ■ ラムダ式 File dir = new File("〜"); File[] dirs …

第1章 ラムダ式とは : 問題 1 : Arrays.sort とスレッド

問題 1 Arrays.sortメソッドで呼び出されるComparatorのコードは、sortメソッドを呼び出したスレッドで実行されるか? 解答 sortメソッドのスレッドと同じスレッドで実行される。 ■ 検証用コード // 整列対象の配列の初期化 String[] array = new String[16*1…