NetBeans
Java NetBeans
今日は substream() メソッドを使ってみます。
これを使って MyLambdaSample プロジェクトの MyLambdaSample.java に MyBestMember を FightingPower 詳細昇順ソート 最初から3人までスキップさせます。
使い方は簡単で substream() メソッドの引数にスキップさせたい要素数を渡せばいいだけです。
コードは下記のようになります。
jp\yucchi\mylambdasample\MyLambdaSample.java |
212 213 214 215 216 217 218 219 220 221 222 223 224 225
|
// MyBeatMember を FightingPower 詳細照準ソート 最初から3人までスキップする System.out.println("<-- MyBeatMember を FightingPower 詳細昇順ソート 最初から3人までスキップする -->"); member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE && m.getAge() >= 16 && m.getAge() <= 29 && m.getBreast() >= 76) .sorted((o1, o2) -> o1.getFightingPower() - o2.getFightingPower()) .substream(3) .collect(Collectors.toList()) .forEach(e -> { System.out.println(e.getName() + ", " + e.getAge() + "歳, " + "Gender : " + e.getGender() + ", " + "Breast Size : " + e.getBreast() + ", FightingPower : " + e.getFightingPower()); }); |
とても便利ですね!
実行結果も確認しておきましょう。
<– MyBeatMember を FightingPower 詳細昇順ソート 最初から3人までスキップする –>
北川 景子, 26歳, Gender : FEMALE, Breast Size : 78, FightingPower : 80
綾瀬 はるか, 28歳, Gender : FEMALE, Breast Size : 88, FightingPower : 85
佐々木 希, 25歳, Gender : FEMALE, Breast Size : 80, FightingPower : 85
石原 さとみ, 26歳, Gender : FEMALE, Breast Size : 82, FightingPower : 89
Java 8 の Lambda とても素敵です。(^_^)
TAGS: Java,NetBeans |
2013年3月28日10:31 AM |
Java NetBeans
今回は limit() メソッドを使ってみます。
MyLambdaSample プロジェクトの MyLambdaSample.java に MyBeatMember を FightingPower 詳細昇順ソート 最初から3人まで とういう機能を実装します。
limit() メソッドを使うと簡単にできてしまいます。( 203 行目 )
jp\yucchi\mylambdasample\MyLambdaSample.java |
196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
// MyBeatMember を FightingPower 詳細照準ソート 最初から3人まで System.out.println("<-- MyBeatMember を FightingPower 詳細昇順ソート 最初から3人まで -->"); member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE && m.getAge() >= 16 && m.getAge() <= 29 && m.getBreast() >= 76) .sorted((o1, o2) -> o1.getFightingPower() - o2.getFightingPower()) .limit(3) .collect(Collectors.toList()) .forEach(e -> { System.out.println(e.getName() + ", " + e.getAge() + "歳, " + "Gender : " + e.getGender() + ", " + "Breast Size : " + e.getBreast() + ", FightingPower : " + e.getFightingPower()); }); |
limit() メソッドの引数に制限数を渡すだけですね。
今回は3人ということなので 3 を渡しています。
実行結果は次のように期待通りの結果となりました。
<– MyBeatMember を FightingPower 詳細昇順ソート 最初から3人まで –>
武井 咲, 19歳, Gender : FEMALE, Breast Size : 76, FightingPower : 66
剛力 彩芽, 20歳, Gender : FEMALE, Breast Size : 77, FightingPower : 75
堀北 真希, 24歳, Gender : FEMALE, Breast Size : 78, FightingPower : 76
便利に使えそうですね。(^_^)
TAGS: Java,NetBeans |
2013年3月27日8:30 AM |
Java NetBeans
今日も Java 8 に備えて良く解らないけど未来のコードと戯れたいと思います。
今回は、Functional Interface と Virtual Extension Methods を試してみたいと思います。
ただ、@FunctionalInterface の使い方がこれであっているのか?解りません(>_<。)
@FunctionalInterface を消しても同じようにコンパイル、実行できてしまうんですよね~
@Override なんかと同じでただの注釈なのかなぁ・・・
メリットが良く解らんぜよw
Virtual Extension Methods は以前にも試したんだけど default キーワードのつく位置が変わったの(決められた)のかな。
さて、それでは試してみます。
jp\yucchi\myfunctionalinterface\MyFunctionalInterface.java |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
|
package jp.yucchi.myfunctionalinterface; public class MyFunctionalInterface { @FunctionalInterface private interface FuncInterface { public void hoge(); // 対象メソッド @Override public String toString(); // あっても関係ないね @Override public boolean equals(Object o); // あっても関係ないね } @FunctionalInterface private interface CompFuncInterface extends FuncInterface { // Virtual Extension Methods default public void foo() { System.out.println("foo"); } // Virtual Extension Methods default public void bar() { System.out.println("bar"); } } public static void main(String[] args) { chome(() -> { System.out.println("hoge"); }); } private static void chome(CompFuncInterface cfi) { cfi.hoge(); cfi.foo(); // Virtual Extension Methods cfi.bar(); // Virtual Extension Methods } } |
実行結果は次のとおりです。
run:
hoge
foo
bar
BUILD SUCCESSFUL (total time: 0 seconds)
実行結果からみて Functional Interface の動作は定義されているとおりに問題なく動いているようです。
Functional Interface の定義については長くなりますのでググってみてください。
日本語で詳しく説明されているサイトが見つかるはずです。
今回のプログラムでは
|
@Override public String toString(); // あっても関係ないね @Override public boolean equals(Object o); // あっても関係ないね |
Object クラスのこの二つのメソッドがあっても問題ないこと、
|
// Virtual Extension Methods default public void foo() { System.out.println("foo"); } // Virtual Extension Methods default public void bar() { System.out.println("bar"); } |
この Virtual Extension Methods の default 実装があっても Functional Interface の機能を問題なく実行できることを証明しました。
ちゃんとラムダ式で動いてます。(^_^)
|
chome(() -> { System.out.println("hoge"); }); } |
実行結果からちゃんと二つの Virtual Extension Methods も動いているのが解ります。
Java 8 の正式リリースが楽しみですね(*^▽^*)
TAGS: Java,NetBeans |
2013年3月25日7:21 AM |
Java NetBeans
今回は その2 で作ったプログラムの年齢とバストサイズでフィルタリングし、ファイティングパワーで昇順ソートして生成した List を操作してみます。
といっても何も大したことはしていません。
とりあえず下記コードを追加しました。
jp\yucchi\mylambdasample\MyLambdaSample.java |
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
|
// MyBestMember の FightingPower の要素数を取得 System.out.println("<-- MyBestMember の FightingPower の要素数を取得 -->"); long count = member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE && m.getAge() >= 16 && m.getAge() <= 29 && m.getBreast() >= 76) .map(MyTeam::getFightingPower) .count(); System.out.println("要素数は " + count + " です。"); // MyBestMember の FightingPower 最初の要素を取得 (最小値) System.out.println("<-- MyBestMember の FightingPower 最初の要素を取得 -->"); int collect = member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE && m.getAge() >= 16 && m.getAge() <= 29 && m.getBreast() >= 76) .map(MyTeam::getFightingPower) .sorted(Integer::compareTo) .collect(Collectors.toList()).get(0); System.out.println(collect); // MyBestMember の FightingPower 最後の要素を取得 (最大値) System.out.println("<-- MyBestMember の FightingPower 最後の要素を取得 -->"); int collect2 = member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE && m.getAge() >= 16 && m.getAge() <= 29 && m.getBreast() >= 76) .map(MyTeam::getFightingPower) .sorted(Integer::compareTo) .collect(Collectors.toList()).get((int) (count - 1)); System.out.println(collect2); // MyBestMember の FightingPower 全要素を表示 System.out.println("<-- MyBestMember の FightingPower 全要素を取得 -->"); List<Integer> collect3 = member.parallelStream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE && m.getAge() >= 16 && m.getAge() <= 29 && m.getBreast() >= 76) .map(MyTeam::getFightingPower) .sorted(Integer::compareTo) .collect(Collectors.toList()); System.out.println(collect3); } } |
要素数は 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]
TAGS: Java,NetBeans |
2013年3月19日7:49 PM |
Java NetBeans
今日も NetBeans 8 Dev を使って Lambda で遊んでみます。
せっかく優秀な統合開発環境を使ってるんだからその機能を使って Lambda の並行処理がちゃんとされているか確認します。
決して疑ってる訳ではございません。
でも、この眼でしっかり確認してみたいだけです。
ってことで昨日作ったプログラムをちょこっと変更して本当に Fork / join Framework が呼び出されているか見てみます。
jp\yucchi\mylambdasample\MyLambdaSample.java |
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
// テスト用メンバーを作成 for (int i = 0; i < 20_000_000; i++) { member.add( new MyTeam( "TEST" + i, LocalDate.of(1995, 1, 1), MyTeam.Sex.FEMALE, 90, random.nextInt(20_000_000))); } // MyBestMember FightingPower 最大値を表示 System.out.println("<-- MyBestMember FightingPower 最大値を表示 -->"); long startTime = System.nanoTime(); Integer reduce = member.stream().filter(m -> m.getGender() == MyTeam.Sex.FEMALE && m.getAge() >= 16 && m.getAge() <= 29 && m.getBreast() >= 76) .map(MyTeam::getFightingPower) .reduce(0, Math::max); System.out.println(reduce); long time = System.nanoTime() - startTime; System.out.println((int) (time * 1e-9) / 3_600 + "時間" + (int) ((time * 1e-9) / 60) % 60 + "分" + (int) (time * 1e-9 % 60) + "秒" + Double.toString((time * 1e-9 % 60) % 1).substring(2)); } } |
このようにテスト用メンバーを適当に追加して 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 を使えばこのような並行処理プログラミングを意識しないでも簡単に実装できてしまうってことね。

TAGS: Java,NetBeans |
2013年3月14日11:48 PM |
« 古い記事
新しい記事 »