Java

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 タグ: ,

NetBeans 8 Dev を使って Lambda で遊ぶ

Java NetBeans

NetBeans で Lambda がお気楽に試せる時代がやってきたので今日もちょこっとだけ遊んでみました。

先日チュートリアルを試してみたんだけど途中で上手くいかなかったので今度はシステムプロパティを取得するプログラムを組んでみた。

コードは下記のようにとりあえず Lambda を使わないもので組んだ。

jp\yucchi\printsystemprop\PrintSystemProp.java

実行結果は次のようになる。

java.specification.vendor: Oracle Corporation
java.endorsed.dirs: C:\jdk1.8.0\jre\lib\endorsed
java.vm.specification.version: 1.8
java.vm.specification.name: Java Virtual Machine Specification
java.vendor.url: http://java.oracle.com/
sun.java.launcher: SUN_STANDARD
awt.toolkit: sun.awt.windows.WToolkit
java.vendor: Oracle Corporation
java.io.tmpdir: C:\Users\Yucchi\AppData\Local\Temp\
java.class.path: C:\Users\Yucchi\Documents\NetBeansProjects\PrintSystemProp\build\classes
sun.arch.data.model: 64
user.name: Yucchi
os.version: 6.2
java.vendor.url.bug: http://bugreport.sun.com/bugreport/
os.name: Windows 8
sun.boot.library.path: C:\jdk1.8.0\jre\bin
java.awt.graphicsenv: sun.awt.Win32GraphicsEnvironment
java.library.path: C:\jdk1.8.0\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Java\jdk1.7.0_17\bin;C:\Program Files (x86)\Windows Live\Shared;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files (x86)\JustSystems\JSLIB32;C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\110\DTS\Binn\;.
user.home: C:\Users\Yucchi
sun.os.patch.level:
sun.cpu.isalist: amd64
java.vm.vendor: Oracle Corporation
user.country: JP
java.vm.version: 25.0-b19
path.separator: ;
sun.java.command: jp.yucchi.printsystemprop.PrintSystemProp
java.home: C:\jdk1.8.0\jre
java.runtime.version: 1.8.0-ea-lambda-nightly-h3500-20130225-b79-b00
line.separator:

java.awt.printerjob: sun.awt.windows.WPrinterJob
file.separator: \
sun.io.unicode.encoding: UnicodeLittle
sun.boot.class.path: C:\jdk1.8.0\jre\lib\resources.jar;C:\jdk1.8.0\jre\lib\rt.jar;C:\jdk1.8.0\jre\lib\sunrsasign.jar;C:\jdk1.8.0\jre\lib\jsse.jar;C:\jdk1.8.0\jre\lib\jce.jar;C:\jdk1.8.0\jre\lib\charsets.jar;C:\jdk1.8.0\jre\lib\jfr.jar;C:\jdk1.8.0\jre\classes
java.vm.info: mixed mode
sun.desktop: windows
java.version: 1.8.0-ea
java.class.version: 52.0
java.specification.name: Java Platform API Specification
file.encoding: UTF-8
sun.cpu.endian: little
user.script:
java.vm.specification.vendor: Oracle Corporation
java.vm.name: OpenJDK 64-Bit Server VM
user.dir: C:\Users\Yucchi\Documents\NetBeansProjects\PrintSystemProp
sun.management.compiler: HotSpot 64-Bit Tiered Compilers
java.runtime.name: OpenJDK Runtime Environment
user.variant:
file.encoding.pkg: sun.io
java.specification.version: 1.8
sun.jnu.encoding: MS932
java.ext.dirs: C:\jdk1.8.0\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
user.timezone:
user.language: ja
os.arch: amd64

とりあえずちゃんと取得できているようだ。

このプログラムを NetBeans はラムダ式を使うようにお勧めしてくれます。

Use Functional Operation をクリックすると

1

素敵な未来の Java コードに変換してくれます。

2

さて、このままではおもしろくないので キーが sun からはじまるシステムプロパティだけを取得するようにしてみます。

Stream インタフェースが活躍してくれます。

filter()、forEach() を使ってこのように篩い分けをしてくれます。

慣れるまでは違和感がありますが近い将来はこのようなコードを組む時代がそこまでやってきているようです。

jp\yucchi\printsystemprop\PrintSystemProp.java

実行結果は

sun.io.unicode.encoding: UnicodeLittle
sun.boot.class.path: C:\jdk1.8.0\jre\lib\resources.jar;C:\jdk1.8.0\jre\lib\rt.jar;C:\jdk1.8.0\jre\lib\sunrsasign.jar;C:\jdk1.8.0\jre\lib\jsse.jar;C:\jdk1.8.0\jre\lib\jce.jar;C:\jdk1.8.0\jre\lib\charsets.jar;C:\jdk1.8.0\jre\lib\jfr.jar;C:\jdk1.8.0\jre\classes
sun.management.compiler: HotSpot 64-Bit Tiered Compilers
sun.java.command: jp.yucchi.printsystemprop.PrintSystemProp
sun.arch.data.model: 64
sun.jnu.encoding: MS932
sun.cpu.endian: little
sun.os.patch.level:
sun.desktop: windows
sun.cpu.isalist: amd64
sun.java.launcher: SUN_STANDARD
sun.boot.library.path: C:\jdk1.8.0\jre\bin

とりあえず目的は果たしているようです。

ただし、私はあまり Lambda のことを調べてないので上記のコードで正しいのか自信ありません。

詳しい人がこれをご覧になっていてもっと良い方法があるんでしたらご指摘くださると嬉しいです。

Hatena タグ: ,

配列に初期値をセットするのに便利なメソッド

Java

こんなのがあったなんてしらなかった。

配列の初期値を –1 で初期化したい場合なんかに便利かも fill() ってのがありました。

今までこの存在に気付かなかった(゜´Д`゜)

Arrays.fill()

Hatena タグ:

« 古い記事 新しい記事 »