投稿

12月, 2020の投稿を表示しています

12月17日(木)1、2コマ目

イメージ
今日、やったこと ストリームAPI(特に終端操作) 今日のホワイトボード ラムダ式で使える変数 引数やローカル変数(ラムダ式が長くなるため使いたくない)は当然OKですが、ラムダ式の外で宣言された変数も実質finalならアクセス可能です。 図 ラムダ式からラムダ式の外で宣言した変数にアクセス 中間操作のfilter()で複数条件のorを行いたい filter()の引数はPredicate<T>です。このPredicate<T>にはor(Predicate<T>)メソッドがあります。or()メソッドは2つのPredicateインスタンスのorを行うPredicateのインスタンスを返します。 図 filter()で複数条件のorを使う 例 地域名が中国 か 四国 [or()を使わない] PrefectureDAO.findAll() .stream() .filter( p->p.getArea().equals("中国") || p.getArea().equals("四国") ) ・・ [or()を使う] // まずは中国地方で検索用Predicate生成 Predicate<Prefecture> pred = p->p.getArea().equals("中国"); // or()メソッドで 中国地方検索用Predicate || 九州地方検索用Predicate生成 pred = pred.or(p->p.getArea().equals("九州")); PrefectureDAO.findAll() .stream() .filter( pred ) ・・ 終端操作collect() 終端操作のなかでももっともオールマイテ...

12月10日(木)1、2コマ目

イメージ
今日、やったこと ストリームAPI(中間操作、終端操作) 今日のホワイトボード (おさらい)ストリームAPIのイメージ ストリームに対して、中間操作(フィルタリング、データ加工、ソート)を行い、最後に終端操作でほしいデータだけ取り出す(最大値や最小値)、ほしいデータへ変更(リストへ)する。 図 ストリームAPIのイメージ [中間操作]map():データの加工 ストリーム中の各データを加工します。 例えば、「Employeeクラスのインスタンスから氏名だけを取り出す」等。 図 [中間操作]map() [中間操作]sorted():ソート ソートです。 ストリームの各要素のソートを行います。 引数で渡されたComparatorの戻り値が正の場合、2つの要素を入れ替えます。 図 [中間操作]sorted() 練習問題 練習1 部署がADMINかDEVELOPな人をIDの昇順で出力。 ただし、出力フォーマットは以下のとおり。 [ID]氏名(部署)サラリー 練習2 サラリートップ3をサラリーの降順で出力。 ただし、出力フォーマットは以下のとおり。 氏名(部署)サラリー。 終端操作 ストリームの各データをリストにまとめたり、最大値や最小値を取得したりとストリームからほしいデータだけを取り出したり、別の形へ変更します。 図 終端操作(左側) Optional<T>型 終端操作のmax()やmin()の戻り値はOptional<T>型です。 Optional<T>型はT型のインス...

12月8日(火)1、2コマ目

イメージ
今日、やったこと メソッド参照演習 ストリームAPI メソッド参照の演習 まずはおさらい。 図 メソッド参照 おさらい おまけ 引数が2つのコンストラクタは 引数の型はint型 戻り値(コンストラクタで戻り値はおかしい気がするが)はCalcurator型 です。 この組み合わせと同じメソッドを持つ関数型インタフェースは残念ながらありません。 が、引数がint型ではなく、Integer型ならBiFunction<Integer, Integer, Calcurator>型がマッチします。 問題は引数がint型ではなく、Integer型である点ですが、Javaには プリミティブ型=>ラッパークラスの自動変換を行うオートボクシング ラッパークラス=>プリミティブ型の自動変換を行うオートアンボクシング があります。 これを使えばBiFunction<Integer, Integer, Calcurator>型で問題なしです。 図 オートボクシング、オートアンボクシング 一応、解答例を挙げときます。 Mainクラス 標準関数型インタフェースのなかから、参照したいメソッドの引数、戻り値の組み合わせと同じメソッドを持つインタフェースを探すだけです。 IntTriFunctionインタフェース 最後のaveraeg()メソッドは引数が3つ、戻り値が型です。 残念ながら標準関数型インタフェースにはこのようなメソッドを持つインタフェースがないため、自作します。 ストリームAPI Javaで今どきのモダンな関数型プログラミングをするための必須アイテムがストリームAPIです。 簡単に言うと、コレクション(Listとか)をループを使わずに検索したり、加工できる便利な仕組みです。 ...

12月3日(金)1、2コマ目

イメージ
今日、やったこと 関数型インタフェースおさらい演習 メソッド参照 「関数型インタフェース」おさらい課題 ソースコードを載せときます。といっても、ポイントになるのはServiceクラスだけです。 [ビジネスロジックレイア]Serviceクラス 今日のホワイトボード メソッド参照 今までは変数に代入できるものは 値(変数がプリミティブ型の場合) インスタンスへの参照情報(変数がxxxクラス型の場合) でした。 図 変数に代入できるモノ(今までは) が、Java8からはこれらに加えて、 メソッドへの参照情報 も代入できるようになりました。 図 変数に代入できるモノ(いまは) 図 インスタンスへの参照とメソッドへの参照(イメージ) メソッド参照を代入できる変数の型 関数型インタフェースを使います。 参照するメソッドの 引数 戻り値 が同じメソッドを持つ関数型インタフェースです。 図 メソッド参照が代入された変数でメソッド実行 例1 Stringクラスのlength()メソッド [メソッド参照を代入する変数の型] Stringクラスのlength()メソッドは 引数はなし 戻り値はint型 なので、Stringクラスのlength()メソッドへの参照情報が代入できる変数の型は IntSupplier型 (int getAsInt()メソッドを持つ)になります。 [参照情報の取得] このlength()メソッドは インスタンスメソッド なので、 ...