CUBは子供の白熊

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

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

第5章 日付と時刻の新たな API

日付を表すjava.util.Dateクラスの機能は確かに不十分だが、それを補うために JDK 1.1 で導入されたjava.util.Calendarは、ちょっといただけなかった インスタンスを生成するメソッドが貧弱 … 結局Dateを使うことになる SimpleDateFormatが対応していないの…

第4章 JavaFX による GUI プログラミング : 問題 10 : ブラウザ

問題 WebViewerを使用して、URLバーと戻るボタンを持つブラウザを実装せよ 解答 やってみましょう public void start(Stage stage) throws Exception { // 末端のコントロール Button backButton = new Button("戻る"); TextField urlField = new TextField(…

第4章 JavaFX による GUI プログラミング : 問題 9 : アニメーション

問題 惑星を表す円をアニメーション化して、楕円軌道を回るようにせよ 解答 絵はしょぼいですが、やってみましょう public void start(Stage stage) throws Exception { final double rX = 200; final double rY = 160; final double cX = rX + 24; final do…

第4章 JavaFX による GUI プログラミング : 問題 8 : FXML

問題 FXML ファイルを解析する際には、JavaFX 固有の知識は必要ない JavaFX で何もせずに、入れ子になっているオブジェクトを持つオブジェクトをロードし、FXML 構文でプロパティを設定する例を作成せよ 注入を使用できれば、さらに良い 解答 この問題も、出…

第4章 JavaFX による GUI プログラミング : 問題 7 : CSS

問題 CSS を使用しないで、コントロールの境界を設定する方法を調べよ 境界について “境界” というのは、下の図(CSS Box Model)の Border だよね CSS はNodeクラスに適用できるが、Border プロパティを持っているのはNodeの派生クラスのRegionである Borde…

第4章 JavaFX による GUI プログラミング : 問題 6 : レイアウト

問題 BorderPaneの Top と Bottom の配置をセンタリングせよ サンプル BorderPaneは5つのエリア(Node)を持っている 5つのエリアにボタンを配置すると public void start(Stage stage) throws Exception { BorderPane pane = new BorderPane(); pane.setTop…

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

第4章 JavaFX による GUI プログラミング : 問題 4 : バインディング

問題 本文のサンプルコード “常に中心に配置される円” を 常に中心に配置され、四辺の少なくとも二つに接する に拡張せよ 解答 “常に中心に配置される円” のコードは以下のとおり import static javafx.beans.binding.Bindings.*; public void start(Stage s…

第4章 JavaFX による GUI プログラミング : 問題 3 : JavaFX Property の遅延作成その2

問題 ほとんどがデフォルトから変化しない多くの JavaFX プロパティを持つクラスで、デフォルトではない値に設定されたり、初めてxxxProperty()メソッドが呼び出されたときにプロパティオブジェクトを作成するようにせよ 解答 本文にあったGreetingクラスとT…

第4章 JavaFX による GUI プログラミング : 問題 2 : JavaFX Property の遅延作成

問題 チャートやテーブルといった多くの JavaFX プロパティを持つクラスでは、ほとんどのプロパティにリスナーが登録されない可能性が高い 従って、プロパティごとにプロパティオブジェクトを持つのは無駄である 最初は普通のフィールドを使用してプロパティ…

第4章 JavaFX による GUI プログラミング : 問題 1 : テキストフィールドとラベル

問題 テキストフィールドとラベルを持つプログラムを実装せよ ラベルのテキストは "Hello, JavaFX"、フォントは100ポイント ユーザーがテキストフィールドを編集したらラベルのテキストを連動して更新する 解答 これこそ、まさに練習問題ですね :-) ついでに…

第4章 JavaFX による GUI プログラミング

Oracle は JavaFX に本気です GUI プログラミングは Java の最大の弱点だった AWT は醜いし、Swing は AWT を基に増築したのでクラスが多すぎて訳が分かんないし Swing でJFrameを作成したときにいくつペインがあります? あと、Swing は一般性にこだわり過ぎ…

第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章 ラムダ式を使ったプログラミング : 問題 21 : Future の型変換

問題 Future<T>をFuture<U>に変換するメソッド <T, U> Future<U> map(Future<T> future, Function<T, U> mapper) を実装せよ 解答 特にこれと言った工夫もないのだけど… public static <T, U> Future<U> map(Future<T> future, Function<T, U> mapper) { return new new Future<U>() { // タスクの実行の取</u></t,></t></u></t,></t,></t></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を拡張した畳み込みフィルターの関数型イン…

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