2013

Java 8 Date and Time API の素敵なコード

Java

Java 8 で採用される Lambda よりもひょっとしたら素敵な Date and Time API の素晴らしい使い方をネットで見つけました。

NetBeans 8 Dev を使って Lambda で遊ぶ その2 で Date and Time API を使って年齢を取得しました。

今日、ネットサーフィン(死語)で素晴らしいコードを見つけたのでそれを使ってみました。

変更前のコード

変更後のコード

とてもすっきりしてますね(^_^)

この情報は日本語でこちらのサイトの記事を参考にさせていただきました。

年齢を計算する、java.util.Calendarとjava.time.LocalDateとで

詳しく丁寧に解説されていますので興味のある方は参考に!

ちなみに、私は年齢の繰り上がる日時を今の今まで思い違いをしてました( ̄。 ̄;)

Hatena タグ:

Lambda の罠

Java

このところ Java 8 で注目の Lambda を NetBeans 8 Dev を使ってネットから情報収集して楽しんでます。

今回は絶対はまりそうなコードを紹介します。

Lambda に興味がある人は既にご存じかと思いますが、なかなか面白そうなのでよかったら見てください。

では次のプログラムを実行したらどうなるでしょうか?

jp\yucchi\mylambda_2\MyLambda_2.java

簡単じゃないかと思ったあなた!

正解です。(^_^)

私のコンピュータでの実行結果は次のようになります。

run:
true
true
true
BUILD SUCCESSFUL (total time: 0 seconds)

では、このプログラムの WOW 定数をもっと大きな値にしてみたらどうなるでしょうか?

11 private final static int WOW = 10_000;

それでは実行してみます。

run:
true
false
true
BUILD SUCCESSFUL (total time: 0 seconds)

とても素敵な結果が表示されました。(;゜ロ゜)

たぶん、感の鋭い方なら 25 行目のコードをみただけでこのような結果になるのは容易に想像できたでしょう。

これって絶対はまりそうな気がするのは私だけでしょうか?

Hatena タグ:

NetBeans 8 Dev を使って Lambda で遊ぶ その4

Java NetBeans

今回は その2 で作ったプログラムの年齢とバストサイズでフィルタリングし、ファイティングパワーで昇順ソートして生成した List を操作してみます。

といっても何も大したことはしていません。

とりあえず下記コードを追加しました。

jp\yucchi\mylambdasample\MyLambdaSample.java

要素数は stream オブジェクトのエレメント数を count() メソッドで取得しただけです。

戻り値が long なので要注意です。

これを利用して新しく生成された List<Integer> オブジェクトを操作して最小値と最大値を求めています。

ここで long の count を int にキャストしているのがちょっとアレですね・・・

もっとスマートな方法があるのかもしれません。

最後は新しく生成された List<Integer> オブジェクトを表示させただけです。

結局、stream でゴニョゴニョやってそれで新しい List にしてしまえば今までどおりチョメチョメ操作できてしまうってことかな?

ほとんど Lambda とは関係ない内容になってますが stream オブジェクトの要素数の取り方ってことでお茶を濁します。( ̄。 ̄;)

あっ、ちなみに実行結果は次のようになります。

<– MyBestMember の FightingPower の要素数を取得 –>
要素数は 7 です。
<– MyBestMember の FightingPower 最初の要素を取得 –>
66
<– MyBestMember の FightingPower 最後の要素を取得 –>
89
<– MyBestMember の FightingPower 全要素を取得 –>
[66, 75, 76, 80, 85, 85, 89]

Hatena タグ: ,

NetBeans 8 Dev を使って Lambda で遊ぶ その3

Java NetBeans

今日も NetBeans 8 Dev を使って Lambda で遊んでみます。

せっかく優秀な統合開発環境を使ってるんだからその機能を使って Lambda の並行処理がちゃんとされているか確認します。

決して疑ってる訳ではございません。

でも、この眼でしっかり確認してみたいだけです。

ってことで昨日作ったプログラムをちょこっと変更して本当に Fork / join Framework が呼び出されているか見てみます。

jp\yucchi\mylambdasample\MyLambdaSample.java

このようにテスト用メンバーを適当に追加して strean() メソッドを使った処理と parallelStream() メソッドを使った場合の違いを確認します。

まず、stream() メソッドを使った時の実行結果は次のようになりました。

run:
<– MyBestMember FightingPower 最大値を表示 –>
19999999
0時間0分41秒8805609010000026
BUILD SUCCESSFUL (total time: 1 minute 0 seconds)

次に昨日のように parallelStream() メソッドを使った場合は

run:
<– MyBestMember FightingPower 最大値を表示 –>
19999999
0時間0分20秒9766124870000006
BUILD SUCCESSFUL (total time: 43 seconds)

このように parallelStream() メソッドを使った方が高速に処理されることが確認できました。

このようにはっきりとした違いが確認できたので次はその仕組みである parallelStream() メソッドを使うと

Fork / join Framework が呼び出されて並行処理をしているところを NetBeans のプロファイラにて暴き出してみてみます。

まず、貧相な stream() メソッドを使った場合からみてみます。

次に贅沢な parallelStream() メソッドを使った場合はこうなります。

このように parallelStream() メソッドを使った場合は  Fork / join Framework が呼び出されているのが解ります。

stream() メソッドの存在価値ってどうなんでしょう?

贅沢な parallelStream() メソッドを使っていればいいのかな?

使い分けシチュエーションがちょっと解りません。

今時、携帯電話さえマルチコアになってるんだからとりあえず parallelStream() メソッドを使っとけばいいのか?

とりあえず Lambda を使えばこのような並行処理プログラミングを意識しないでも簡単に実装できてしまうってことね。

cludia_6_001

Hatena タグ: ,

NetBeans 8 Dev を使って Lambda で遊ぶ その2

Java NetBeans

先日はシステムプロパティを取得するプログラムを組んでみたけど誰からもツッコミが入らなかったのでこのまま

勝手にイケイケでよくあるサンプルコードを JDK 8 ならこんなになるのかって勝手に思い込む遊びをします。

決して良い子のみんなは真似をしないようにね!

とりかえしのつかないことになるといけないからね(爆

今回は Java 8 について Twitter 上で下記のようなつぶやきがあったのでそれも試してみます。

「みんな、Java8のラムダは飾りでメソッド参照こそ本命ということに気づいてきた」

私は新しく使いやすくなる日付関係の Date and Time API が本命だと気付きました。(^_^;)

これも今回ちょこっとだけ使ってみたいと思います。

開発環境はこの前と同じです。

NetBeans 8 Dev の未来を先取りする賢い補完機能にずいぶん助けられます。

Java 8 を気楽に試してみたい人にはお勧めです。

では、今回試してみたプログラムをご覧ください。

素人が組んだものですから生暖かい眼差しで見て間違ってるところやここはこうしたほうがいいよって優しく教えてくれたら感激です。

jp\yucchi\mylambdasample\MyTeam.java

jp\yucchi\mylambdasample\MyLambdaSample.java

プログラムの内容にはあまり触れないでくださいね。

私の好みの問題ですから(〃・ω・〃)

既に気付かれた方もいるでしょうが Date and Time API を使うと非常にシンプルで直感的に使えます。

細かい説明はしませんので JavaDoc をさらってご覧になってくださいませ。

カレンダー関係に悩まされてきたそこの あ・な・た !

やっとイライラから解放されるかもしれません。

1

カレンダーをセットするのも簡単になってます。(50行目)

2

今まで月の扱いがうざいなぁって思っていたのがやっと解消されますね。

次に、メソッド参照をみてみましょう。

118行目、120行目、128行目、129行目で使ってます。

:: を使った何かしっくりこない違和感の塊がメソッド参照と呼ばれている新機能です。

引数で渡されたオブジェクトのメソッドを呼ぶ機能のようです。

これは単にコード記述量が少なくなるだけなんだろうか?

他に何かメリットがあるのか良く解りません。

今回は static メソッドを使用してますが特定のオブジェクトのインスタンスメソッドや

特定の型の任意のオブジェクトのインスタンスメソッドが使えるようです。

特定のオブジェクトのメソッド参照は、異なる関数型インターフェースに変換する便利な手段を提供します。

任意のオブジェクトのインスタンスメソッド参照は

と引数の数が違います。任意のオブジェクトのメソッド参照には第一引数にインスタンスを渡してます。

要するにラムダ式を書く代わりに既存のメソッドを呼び出すことができるよってことなのかな?

これが Java 8 の本命なのか?

私が知らないもしくは理解が足らないのでもっと便利で素敵な使い方があるのだろうか?

ああ!今日も眠れそうにないなw

3

138行目の sorted メソッドがしっくりこないけどどうしたらいいのか解らないので適当にやったら期待通りに動いてしまった。( ̄。 ̄;)

さて、長くなるけど一応このプログラムの実行結果を載せておきます。

run:
<– MyTeam 全員表示 –>
ほげほげ たこたろう, 32歳, Gender: MALE, Breast Size: 90, FightingPower: 100
壇蜜, 32歳, Gender: FEMALE, Breast Size: 90, FightingPower: 99
北川 景子, 26歳, Gender: FEMALE, Breast Size: 78, FightingPower: 80
綾瀬 はるか, 27歳, Gender: FEMALE, Breast Size: 88, FightingPower: 85
佐々木 希, 25歳, Gender: FEMALE, Breast Size: 80, FightingPower: 85
剛力 彩芽, 20歳, Gender: FEMALE, Breast Size: 77, FightingPower: 75
川口 春奈, 18歳, Gender: FEMALE, Breast Size: 75, FightingPower: 70
堀北 真希, 24歳, Gender: FEMALE, Breast Size: 78, FightingPower: 76
武井 咲, 19歳, Gender: FEMALE, Breast Size: 76, FightingPower: 66
石原 さとみ, 26歳, Gender: FEMALE, Breast Size: 82, FightingPower: 89
深田 恭子, 30歳, Gender: FEMALE, Breast Size: 90, FightingPower: 84
<—MyBestMember –>
北川 景子, 26歳, Gender : FEMALE, Breast Size : 78, FightingPower : 80
綾瀬 はるか, 27歳, Gender : FEMALE, Breast Size : 88, FightingPower : 85
佐々木 希, 25歳, Gender : FEMALE, Breast Size : 80, FightingPower : 85
剛力 彩芽, 20歳, Gender : FEMALE, Breast Size : 77, FightingPower : 75
堀北 真希, 24歳, Gender : FEMALE, Breast Size : 78, FightingPower : 76
武井 咲, 19歳, Gender : FEMALE, Breast Size : 76, FightingPower : 66
石原 さとみ, 26歳, Gender : FEMALE, Breast Size : 82, FightingPower : 89
<– MyBestMember FightingPower 昇順ソート –>
66
75
76
80
85
85
89
<– MyBestMember FightingPower 最大値を表示 –>
89
<– MyBeatMember を FightingPower 詳細昇順ソート –>
武井 咲, 19歳, Gender : FEMALE, Breast Size : 76, FightingPower : 66
剛力 彩芽, 20歳, Gender : FEMALE, Breast Size : 77, FightingPower : 75
堀北 真希, 24歳, Gender : FEMALE, Breast Size : 78, FightingPower : 76
北川 景子, 26歳, Gender : FEMALE, Breast Size : 78, FightingPower : 80
綾瀬 はるか, 27歳, Gender : FEMALE, Breast Size : 88, FightingPower : 85
佐々木 希, 25歳, Gender : FEMALE, Breast Size : 80, FightingPower : 85
石原 さとみ, 26歳, Gender : FEMALE, Breast Size : 82, FightingPower : 89
BUILD SUCCESSFUL (total time: 0 seconds)

では、そろそろ寝ようかな。(眠れたら幸せになれるかも)

Hatena タグ: ,

« 古い記事 新しい記事 »