ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Javaが1.4から8までの間にどう変わったかとか、なぜStreamAPIを学ぶべきか聞いてきた!

2017-06-29 12:04:46 | Weblog
6月28日
JJUG ナイト・セミナー 「Java エンジニアのためのJava(再)入門
に行ってきた!ので、メモメモ




■from old Java to modern Java
- Java初心者から次のステップへ
 あるいは35歳からのJava再入門

・今のJavaって、こうなっているっていう話
・自己紹介
・書籍を書きました:Java本格入門
・アンケート
 Java:どのバージョン
  7 3分の1、4分の1
  6 結構いる
  5,1.4
  8 一番多い
・古いバージョンのJavaを最新のJavaに変える

・イントロダクション
 今回のお題;CSVファイルの読み書き
 リソースはfinallyでクローズする
 →今見せたコードはJava1.4で動きます

<<From 1.4 to 5.0>>
 JavaSE 5.0
 今のJava文法の基礎

・文字配列の結合
 StringBuilder:性能を上げた
 foreach文(拡張for文)

・ファイルの読み込み
 Genericsで型を明確にする→castしなくてよくなった
 アノテーション @override →ミスを防ぐ

<<form 5.0 to 7>>
Java SE 7
 ・try-with-resources
 ・ダイアモンドオペレーター
→このへんからあやしくなる・・

・ファイルへの追記
 try-with-resourcesで()で宣言したリソースがクローズされる
  finallyでcloseするのは古い定石
  catchしなくてもクローズできる
 charsetを文字列で書いていたが、規定済みのものが使えるようになった
 ダイアモンド演算子<>
 複数の例外をまとめてcatchできる
→try-with-resourcesはとにかく非常に大切な機能

<<to 8>>
 ストリームAPI
 Lambda
  :
・StreamAPIとlambda式で一気に文法が変わった

・ファイルの追記
  String.join
  Files のnewBufferedWriter(Paths.get()・・・
   →オプションを渡せる。作成・書き込みルール
 リストを渡して書き込みFiles.write
 ArraysAsList,Collection.singleton
 →Filesのwriteには改行コードが入る

 日付:新しいクラス LocalDateで日付のみを扱う(時間は扱わない)
 →LocalDateTime,offsetDateTime,Zone
 ハイフン区切りのISO8601形式の日付ならフォーマッタなしでパース可能
 LocalDate.ofで年月日指定。月は1から始まる

 →有用なAPIが増えている

・で肝心なストリームAPIとLambda式は
 →後半に続く




■数値計算をきわめるたしなむ
・自己紹介
・Java本格入門たくさんの反響、ありがとうございます!!
 →ご要望いただいた数値計算、やります

・これどうやって保持します?
 商品の単価、購入数 int
 主キー int
 日付 int
 売り上げ int

にすると・・・

テーブルの主キー
 1秒に100件データが登録されると、249日にIDがオーバーフロー
売り上げ
 21億円超えたら使えない

だったらlongを使えば・・・整数はこれでしのげる

・話変わって小数

int price = 100 * 1.08

 エラー発生。doubleを使うと・・

・期待した通りの計算ができない
 小数○位で四捨五入
 数値を正しく表現できない→2進小数の限界

 0.1→循環小数になる:どこかで打ち切られる

 1円単位の
 BigDecimal
 「期待した」計算
 基本的には、この2つ
   new BigDecimal(String val)
   BigDecimal.valueof

   new BigDecimal("0.7")→0.7
   new BigDecimal(0.7)→0.699999999
 →ご利用は計画的に
 BigDecimal BigInteger と スケール
 BigDecimalはいみゅーたぶる

たしざん
  BigDecimal#add
 ひきざんはsubtract
 割り算は、利用方法に注意

 スケール:足し算、引き算は大きい方

 掛け算の場合;スケールの値が足しあわされる

 丸めモードを使って、端数処理しよう
   MathContext

 BigDecimalで割り算をするときは、必ずスケールと丸めモードを指定
 →計算結果が無限小数になると、ArithmeticExceptionが発生

 比較0.7+0.3

 BigDecimal#equals()を使った場合
 BigDecimal#compareTo()を使った場合
 BigDecimal#equals()を使った場合
  →スケールも同じかどうかを判定します

・話が変わって
 Money and Currency APIが採用される予定
  →採用される予定
 参照実装Monetaでは利用できる
   デフォルトの丸め
   通貨変換
 →日本円だけならtoo much 




■StreamAPI入門

・なぜStreamAPIを学ぶべきなのか?
 新しいから?
 性能がいいから?
 簡潔に書けるから?
→物事のとらえかたが今後数年のコーディングに必要だから
 まずは、「簡潔に書けるから」

・StreamAPIとは
 Stream:流れ
 大量データを逐次処理する→コレクションの操作も簡単に書ける
 手続きを書くのではなく、目的をかく
 コレクションの絞り込みなど・・

 とはいえ

 無理してStreamAPIで書く必要はないです

・Lambda式
 StreamAPIを簡潔に書くために欠かせないもの
 実装すべきメソッドが1つしかないインターフェースを簡潔に書く
 例:Comparator
  無名クラスにもできる
  実装すべきメソッドが1つしかない:関数型インターフェース
  →StreamAPIの引数は基本的に関数型インターフェース

・Lambda式の文法
 ()→{}
 引数の型は省略できる
 処理が1行だったら returnと{}も省略できる
 引数が1つなら()も省略できる
 メソッド呼び出し1つなら ::

・StreamAPIの書き方
 作る
 操作する
 まとめる

 Stream()で作り
 map()で加工し
 filter()で絞り込み
 collect()でまとめる

 操作:絶対に覚えてほしいmapとfilter
 そのほか limit,distinct,
 mapなどの変換処理では要素の数は変わらない
 filterで分岐することもできない
 flatmap

 終端操作:まとめる
 一番使うのがcollectとCollectorsの組み合わせ
 終端処理は1回だけ

・さっきのto 8
 try with resouecesにする

・なぜ重要なのか
 Collectionを簡潔に扱えるようになるかわりに
 結構、覚えることが多い
 対して融通も聞かない
 StreamAPIの目的はStreamを扱うこと
  Collectionはすでに内容が決まっているデータ
   cold stream
  本来のStreamは内容や上限が決まっていない
   hot stream
 Java8はcold stream
 主戦場はHot Stream
  →ウィンドウ関数が必要 Java9で少し入る
   RxJava
  →マイクロサービス
   ノンブロッキングな非同期API

・hotStreamを扱うためにColdStreamで練習する


この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 中国インターネット安全法っ... | トップ | Androidで別ネットワークにあ... »
最新の画像もっと見る

Weblog」カテゴリの最新記事