CUBは子供の白熊

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

関数型プログラミング

第3章 ラムダ式を使ったプログラミング : 問題 12 : 遅延画像クラス LatentImage の拡張

問題 本文に出てきた色変換を遅延実行する画像 LatentImage クラスをUnaryOperator<Color>とColorTransformerの両方をサポートするように拡張せよ ■ LatentImage クラスの概要 public class LatentImage { /** 変換対象の画像 */ private final Image in; /** 適用</color>…

第3章 ラムダ式を使ったプログラミング : 問題 11 : 色変換の合成

問題 二つのColorTransformerを合成するメソッドを実装せよ さらにUnaryOperator<Color>から、X座標とY座標を無視するColorTransformerを生成するメソッドを実装せよ 解答 この本には “static メソッド” と指定してあったが、私が最もふさわしいと思う場所、即ちCol</color>…

第3章 ラムダ式を使ったプログラミング : 問題 10 : 関数合成

問題 第3章 ラムダ式を使ったプログラミング : 画像変換 - CUBは子供の白熊 において、transformメソッドに渡すUnaryOperator<Color>は以下のように指定した Image finalImage = transform(image, Color::brighter); そこで、画像変換を “グレースケールにしてから</color>…

第3章 ラムダ式を使ったプログラミング : 問題 9 : リフレクションによる Comparator の生成

問題 指定された順序で指定されたフィールドを比較するComparatorを生成するメソッド Comparator lexicographicComparator(String... fieldNames) を書け。 例えば lexicographicComparator("lastname", "firstname") は 2つのObjectを引数に受け取り リフレ…

第3章 ラムダ式を使ったプログラミング : 問題 8 : 画像変換の生成

問題 画像に任意の幅と任意の色の枠を追加するColorTransformerを生成するメソッドを実装せよ 解答 ColorTransformerは、第3章 ラムダ式を使ったプログラミング : 問題 5 : 座標を考慮した画像変換 - CUBは子供の白熊 で以下のように定義した @FunctionalInt…

第3章 ラムダ式を使ったプログラミング : 問題 7 : Comparator の生成

問題 7 Comparator<String>を生成するメソッドをラムダ式を使って書け このComparatorは、以下のオプションを組み合わすことができるようにせよ 普通の順序 or 逆順 大文字・小文字を区別 or 区別しない 空白を含める or 除外する 解答 “空白を除外”とは、トリミング</string>…

第3章 ラムダ式を使ったプログラミング : 問題 6 : パラメータ付き画像変換

問題 6 画像変換で、UnaryOperator<Color>ではなくBiFunction<Color, T, Color>を引数にとる transform メソッドを実装せよ 画像変換のオリジナルは 第3章 ラムダ式を使ったプログラミング : 画像変換 - CUBは子供の白熊 を参照 解答 これで変換関数にパラメータを渡すことができる。</color,></color>…

第3章 ラムダ式を使ったプログラミング : 問題 5 : 座標を考慮した画像変換

問題 画像変換を、色だけでなく座標も参照するように拡張する。 そのために以下の関数型インターフェースを導入する。 @FunctionalInterface interface ColorTransformer { Color apply(int x, int y, Color colorAtXY); } 画像の周りの10ピクセルを灰色の枠…

第3章 ラムダ式を使ったプログラミング : 画像変換

3章の本文では、ラムダ式の応用として 画像の個々のピクセルの色の変換する 画像変換のサンプルが載っている。 このときに使用する関数型インターフェースはUnaryOperator<Color>である。 ■ 変換前と変換後の画像を表示 public class ImageDemo extends Application</color>…

第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 の使い方 : 問題 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 の使い方

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

第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…

第1章 ラムダ式とは

この章は、ラムダ式とインターフェースの拡張について解説している。 ラムダ式とは、一言で言うと パラメータを持つコードブロック で、これ自身オブジェクトとなる。 でも、Java におけるラムダ式は メソッドをひとつだけ持つインターフェース(Functional …