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 |
« 古い記事
新しい記事 »