CUBは子供の白熊

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

関数型プログラミング

第8章 その他の Java 8 機能を理解する : 問題 15 : 簡易 grep

問題 Files.linesとPattern#asPredicateを使用して、与えられた正規表現に一致するすべての行を表示する grep のようなプログラムを書け。 解答 機能をいろいろ盛り込みたいところだけど、ここは簡潔に以下のような仕様とする。 第1引数は正規表現の式、第2…

第8章 その他の Java 8 機能を理解する : 問題 14 : requireNonNull(T, Supplier<String>) メソッド

問題 java.util.ObjectsのrequireNonNull(T, Supplier<String>)メソッドは 第1引数がnullかどうかをチェックし nullのときは第2引数のラムダ式を評価して それをエラーメッセージとするNullPointerExceptionをスローする このメソッドによりもっと役立つエラーメッセ</string>…

第8章 その他の Java 8 機能を理解する : 問題 10 : Files.walk メソッド

問題 まず JDK の src.zip ファイルを解凍せよ。 Files.walkメソッドを使用して、予約語 transient volatile を含む Java のソースファイルを全て見つけよ。 解答 まず、ソースファイルにキーワードtransientまたはvolatileが含まれるかどうかをチェックする…

第8章 その他の Java 8 機能を理解する : 問題 9 : Scanner から Stream を生成

問題 Scannerを、単語, 行, 整数, または double のStreamに変換するメソッドを書け。 解答 以下の手順でStreamを生成する。 ScannerからIteratorを生成 IteratorからSpliteratorを得る SpliteratorからStreamを生成 まず、IteratorからStreamを生成するメソ…

第8章 その他の Java 8 機能を理解する : 問題 6 : Comparator の合成

問題 Comparatorインターフェースのメソッドだけを使ってjavafx.geometry.Point2Dの全順序(Total Ordering)な Comparator を定義せよ。 “全順序” とは、同値なオブジェクトに対してのみゼロを返す Comparator のことである。 解答 X座標の Comparator とY…

第8章 その他の Java 8 機能を理解する : 問題 5 : Stream vs Collection

問題 “第2章 ストリーム API の使い方” で、Listの中の長い単語を Stream を使って数えた。 List<String> words = ~; long count = words.stream() .filter(w -> w.length > 12) .count(); ラムダ式は用いるが Stream を使用しないで同じことを行え。 解答 java.uti</string>…

第8章 その他の Java 8 機能を理解する : 問題 4 : Random はゼロを生成するか?

問題? Math.nextDown(x)メソッドは、何らかのランダムな処理が x に正確に一致した場合に、x よりも次に小さな浮動小数点を返します。 これにより、返された数が x より小さいことが保証されます。 これは本当に保証できるのでしょうか? ちょっと待った! 上…

第6章 並行処理の機能強化 : 問題 11 : タスクを非同期に繰り返す

問題 次のメソッドを作成せよ public static <T> CompletableFuture<T> repeat(Supplier<T> action, Predicate<T> until) このメソッドはuntil関数が受け入れる値を生成するまでactionを非同期に繰り返す そして、until関数も非同期に実行する 解答 public static <T> Compl</t></t></t></t></t>…

第6章 並行処理の機能強化 : 問題 7 : ConcurrentHashMap の reduce メソッド

問題 ConcurrentHashMap<String, Long>内で、最大値を持つキーを見つけよ 同じ Long 値であれば、どのキーであっても構わない 準備 戦争と平和の単語(57万5343語)の出現回数のマップを使う ただし、3文字以下の単語は切り捨てる(でないと the が圧倒的だもんね) ■ 単語</string,>…

第6章 並行処理の機能強化 : 問題 6 : ConcurrentHashMap の computeIfAbsent メソッド

問題 複数スレッドが複数のファイルから全ての単語を読み込むアプリケーションを書け 各々の単語がどのファイルで使用されていたかを管理するためにConcurrentHashMap<String,Set<File>>とcomputeIfAbsentメソッドを使用せよ 準備 読み込むテキストファイルは問題 5 と同じ5つ</string,set<file>…

第6章 並行処理の機能強化 : 問題 5 : ConcurrentHashMap の merge メソッド

問題 複数スレッドが複数のファイルから全ての単語を読み込むアプリケーションを書け 各々の単語がどのファイルで使用されていたかを管理するためにConcurrentHashMap<String,Set<File>>とmergeメソッドを使用せよ 準備 テキストファイルから単語を順次読み込む Reader を定義</string,set<file>…

第6章 並行処理の機能強化 : 問題 4 : LongAccumulator

問題 LongAccumulatorを使用して、要素の最大値あるいは最小値を計算せよ 解答 1000万個の配列を用意して、最大値を求めてみる ■ 準備 long[] values = new long[1000_0000]; for (int i = 0; i < values.length; i++) { values[i] = (long)(1000_0000 * Mat…

第6章 並行処理の機能強化 : 問題 3 : AtomicLong と LongAdder

問題 1,000個のスレッドを生成し、各スレッドは、ある一つのカウンターを100,000回インクリメントする AtomicLong と LongAdder を使用した場合の性能を比較せよ 解答 ■ AtomicLong final int TASK = 1000; final int COUNT = 100_000; AtomicLong globalCou…

第6章 並行処理の機能強化 : 問題 1 : AtomicReference

問題 多数のスレッドが更新する最大長の文字列を管理するプログラムを書け 解答 単語の一覧は、第2章で出てきた戦争と平和(war-and-peace.txt)を使う ■ 単語一覧の取得 … 単語数 = 575,343 String[] words; String contents = new String( Files.readAllBy…

第5章 日付と時刻の新たな API : 問題 12 : 約束の通知

問題 異なるタイムゾーンにある約束を読み込んで、ローカル時刻で1時間前に約束があることをユーザーに通知せよ 例えば、ニューヨークで午前10時に電話会議があったときも、今いる東京で正しいローカル時間に通知を受けることができる 解答 約束とは、タイト…

第5章 日付と時刻の新たな API : 問題 9 : 分の端数がある時差

問題 全てのタイムゾーンおいて、UTC との時差に1時間未満の情報が含まれる全てのタイムゾーンを見つけよ 解答 “1時間未満の情報が含まれる” とは、「時差が1時間より小さい」ということではなく、「時差に分の端数が出る」という意味だと解釈した では、時…

第5章 日付と時刻の新たな API : 問題 8 : タイムゾーンと時差

問題 現在の時刻インスタンスに対してサポートされる全てのタイムゾーンおいて、今日の日付のオフセット(UTC との差)を取得せよ 解答 UTC との時差は、以下の流れで算出する ゾーンID(ZoneId) ↓ そのゾーンIDの日付時間(ZonedDateTime) ↓ UTC の日付時…

第5章 日付と時刻の新たな API : 問題 3 : TemporalAdjuster

問題 Predicate<LocalDate>を受け取りTemporalAdjusterを返すnextメソッドを実装せよ 戻り値のTemporalAdjusterは、翌日以降でPredicateを満たす日付を生成する 例えば today.with(next(w -> w.getDayOfWeek().getValue() < 6)) は、今日より後の最初の平日の日付を返す</localdate>…

第4章 JavaFX による GUI プログラミング : 問題 5 : ObservableValue とラムダ式

問題 次の二つのメソッドを実装せよ public static <T,R> ObservableValue<R> observe(Function<T,R> f, ObservableValue<T> t) public static <T,U,R> ObservableValue<R> observe(BiFunction<T,U,R> f, ObservableValue<T> t, ObservableValue<U> u) このメソッドは、与えられたObservableValueのg</u></t></t,u,r></r></t,u,r></t></t,r></r></t,r>…

第3章 ラムダ式を使ったプログラミング : 問題 24 : Pair の flatMap メソッド

問題 Pair<T>クラスに対するflatMapメソッドを定義できるか? できるとしたら、それは何か? できないとしたら、その理由は何か? 解答 PairにflatMapは定義できない 理由は Pairの要素数が固定されている からである Pairは、明らかにコンテナである でも、その要</t>…

第3章 ラムダ式を使ったプログラミング : 問題 23 : Pair の map メソッド

問題 T 型の対となる二つのオブジェクトを表すPair<T>クラスに対するmap操作を定義せよ 解答 これは簡単ですね public class Pair<T> { public final T first; public final T second; public Pair(T first, T second) { this.first = first; this.second = second</t></t>…

第3章 ラムダ式を使ったプログラミング : 問題 22 : CompletedFuture の flatMap メソッド

問題 CompletableFutureに対するflatMap操作は存在するか? 存在するとしたら、それは何か? 解答 CompletableFuture<T>のmap操作はthenApply(Function<T,U>)メソッドである じゃflatMap操作はどうだろう? T → CompletableFuture<U> なるFunctionからCompletableFuture<U>が</u></u></t,u></t>…

第3章 ラムダ式を使ったプログラミング : 問題 20 : List の要素の型変換

問題 List<T>をList<U>に変換するメソッド <T, U> List<U> map(List<T> list, Function<T, U> mapper) を実装せよ 解答 普通に考えれば以下のようにするだろう ■ 普通 public static <T, U> List<U> map(List<T> list, Function<T, U> mapper) { List<U> result = new ArrayList<U>(list.size()); for (T elem</u></u></t,></t></u></t,></t,></t></u></t,></u></t>…

第3章 ラムダ式を使ったプログラミング : 問題 19 : Stream の reduce メソッド

問題 Stream<T>のreduceメソッドは、以下のように宣言している <U> U reduce(U identify, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner) accumulatorの型を BiFunction accumulator と宣言すべきか? 解答 No ! である Stream<T>のreduceメソッドの Java Doc にあ</t></u></u,></u></t>…

第3章 ラムダ式を使ったプログラミング : 問題 18 : Function と例外

問題 Function<T, U>の抽象メソッドと同じシンタックスでチェック例外をスローするラムダ式からFunction<T, U>を生成する unchecked メソッドを実装せよ 解答 本文にCallable<T>からSupplier<T>を生成する unchecked メソッドが載っている ■ Callable<T>からSupplier<T>生成 public s</t></t></t></t></t,></t,>…

第3章 ラムダ式を使ったプログラミング : 問題 17 : ラムダ式と例外 その2

問題 first と second を並列に実行し、どちらかのメソッドが例外をスローしたら handler を呼び出すメソッド void doInParallelAsync(Runnable first, Runnable second, Consumer<Throwable> handler) を実装せよ 解答 まずRunnableで起こった例外を処理する新たなRunn</throwable>…

第3章 ラムダ式を使ったプログラミング : 問題 16 : ラムダ式と例外

問題 first が生成した結果を second が消費し、その間に発生したエラーを handler が処理するメソッド public static <T> void doInOrderAsync(Supplier<T> first, Consumer<T> second, Consumer<Throwable> handler) { new Thread( () -> { try { T result = first.get(); seco</throwable></t></t></t>…

第3章 ラムダ式を使ったプログラミング : 問題 15 : 画像変換の並列化

問題 LatentImageクラスに操作の並列化機能を追加せよ 解答 LatentImageクラスの Nested Class であるTransformedPixelReaderはスレッドセーフではないので、スレッドセーフな派生クラスを定義する まずTransformedPixelReaderのフィールドを全てprivateから…

第3章 ラムダ式を使ったプログラミング : 問題 14 : PixelReader による画像変換の拡張

問題 ピクセル単位の遅延評価を扱うため、今までの画像変換を変更して、画像内の任意のピクセルを読み込むことができるPixelReaderを渡すようにせよ 色だけを参照する単純な変換であるグレイスケール変換は (x, y, reader) -> reader.getColor(x, y).graysca…

第3章 ラムダ式を使ったプログラミング : 問題 13 : 畳み込みフィルターの遅延処理

問題 ぼやけ検出あるいはエッジ検出といった畳み込みフィルターは、隣接するピクセルから一つのピクセルを計算する 畳み込みフィルターを扱えるように LatentImage クラスを機能強化せよ 解答 まずColorTransformerを拡張した畳み込みフィルターの関数型イン…