2012
Java
Lambda のお試し版を使ってみた。
残念ながら NetBeans 7.2 開発版ではまだサポートされてないようです。
それでメモ帳でというのもちょっとあれなので・・・
昔、昔、お世話になった CPad for Java2 SDK というシンプルなエディタを使ってみた。
コンパイルと実行さえできればいいやってのりで。
と言いつつも NetBeans でコーディングして CPad for Java2 SDK にコピペですが( ̄。 ̄;)
まず日本語で Lambda について解説しているサイトを片っ端からググってみた。
あまりにも少なかった・・・
もう、あちこちにあって並行処理に使う方法などもあるかなって思っていたが
まだ開発途中ってことで仕様変更がされる可能性が高いからかな。
よってまだ Lambda の情報源は数少ないようです。
とりあえず新しいもの好きの私は基本中の基本 Hello World をくんでみた。
jp\yucchi\hello_lambda\Hello_Lambda.java |
|
package jp.yucchi.hello_lambda; interface HelloFunc { void sayHello(); } public class Hello_Lambda { public static void main(String[] args) { HelloFunc hf = () -> { System.out.println("HelloWorld"); }; hf.sayHello(); } } |
うっ! しまった(><)
HelloWorld になってる。スペースを入れ忘れてしまった。
とりあえず Lambda のありがたみが良く解らないはじめての Lambda でした。
Lambda の解説はよく解らないのと良く解らないのに触ってみたいという
好奇心のかたまりだけで始めたので他の親切なサイトで勉強してください。
ちなみに Lambda 式
HelloFunc hf = () -> {
System.out.println(“HelloWorld”);
};
上記の書き方以外にも
HelloFunc hf = () -> System.out.println(“HelloWorld”);
とか
HelloFunc hf = () –> (System.out.println(“HelloWorld”));
でも OK らしい情報があったのですが私の環境ではコンパイルエラーになりました。
情報があっても古くなっていて使えない場合もあるから難しいですね。
TAGS: Java |
2012年5月20日5:05 PM |
Java
Comparator を使ったプログラムをつくった。
そして、思った。
いつもながら・・・ だな。( ̄。 ̄;)
jp\yucchi\lambda_charenge_1\Bust.java |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
package jp.yucchi.lambda_charenge_1; class Bust { private int bustSize; private String evaluation; public Bust(int bustSize, String type) { this.bustSize = bustSize; this.evaluation = type; } public int getBustSize() { return bustSize; } public String getEvaluation() { return evaluation; } } |
jp\yucchi\lambda_charenge_1\Lambda_charenge_1.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
|
package jp.yucchi.lambda_charenge_1; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; public class Lambda_charenge_1 { public static void main(String[] args) { ArrayList<Bust> al = new ArrayList(); al.add(new Bust(90, "巨乳")); al.add(new Bust(70, "貧乳")); al.add(new Bust(100, "爆乳")); al.add(new Bust(80, "普通乳")); Collections.sort(al, new Comparator<Bust>() { @Override public int compare(Bust o1, Bust o2) { return (o1.getBustSize() < o2.getBustSize() ? -1 : o1.getBustSize() == o2.getBustSize() ? 0 : 1); } }); Iterator<Bust> it = al.iterator(); while (it.hasNext()) { Bust data = it.next(); System.out.println(data.getBustSize() + ": " + data.getEvaluation()); } } } |
実行結果は次のようになります。
run:
70: 貧乳
80: 普通乳
90: 巨乳
100: 爆乳
構築成功 (合計時間: 0 秒)
ここで、さらに思った。
Java 8 で採用される Lambda を使えば Comparator の部分がすっきりするんだろうか?
さらに思った。
ところで、Lambda って何?
よくよく考えたら Lambda の前にやろうとしていたクロージャとかいうものもさっぱり知らない。
そろそろ Lambda について調べ始めなければ JDK 8 がリリースされたとしても時代の波に乗れない。
ここで、さらに思った。
Lambda も無かったことにならないかなぁ・・・(後ろ向き・・・
で、このプログラムを Lambda を使ってすっきりさせることができるのか?
私には絶対無理(>_<)
いったい、何をどうすればいいのか解らない。
当然といえば当然だ。
Lambda を知らないからね。
ただ、本当にこのプログラムを Lambda を使えばすっきりしたコードに変更可能なのかが知りたい。
誰か教えてけろ。(いつもながら努力は嫌い (^_^;)
TAGS: Java |
2012年5月20日6:13 AM |
Java
今朝投稿した記事だけど誰も釣られてくれないからプログラムを少し変更してみた。
jp\yucchi\static_sample_4\hoge.java |
|
package jp.yucchi.static_sample_4; public class hoge { static int VAL = 10000; static void calc(int i) { System.out.println("CALL hoge"); System.out.println("VAL = " + VAL); System.out.println(VAL + "* 2 = " + VAL * 2); } } |
jp\yucchi\static_sample_4\chage.java |
|
package jp.yucchi.static_sample_4; public class chage { static int VAL = 1; static void calc(int i) { System.out.println("CALL chage"); System.out.println("VAL = " + VAL); System.out.println(VAL + "* 2 = " + VAL * 2); } } |
jp\yucchi\static_sample_4\Static_sample_4.java |
|
package jp.yucchi.static_sample_4; import static jp.yucchi.static_sample_4.hoge.*; import static jp.yucchi.static_sample_4.chage.VAL; public class Static_sample_4 { public static void main(String[] args) { System.out.println("main() atart VAL = " + VAL); calc(VAL); System.out.println("main() end VAL = " + VAL); } } |
VAL の値を標準出力させてみました。
run:
main() atart VAL = 1
CALL hoge
VAL = 10000
10000* 2 = 20000
main() end VAL = 1
構築成功 (合計時間: 0 秒)
hoge クラスの calc() メソッドが呼ばれてます。
main() メソッドの中にある calc() メソッドの引数の値は1のようです。
そして、calc(VAL) メソッドでよばれるのが hoge クラスなのは何故?
その答えは単純です。
static import 文をよく見てください。
chage クラスは static 変数である VAL だけをインポートしています。
よって、chage クラスの calc(VAL) メソッドは呼ばれることは無いんです。
hoge クラスの calc(VAL) が呼ばれて hoge クラスの VAL の値で計算されてしまいます。
なかなか面白いことになってますね。
引数の値よりクラスの static 変数が優先されてしまう。
chage クラスの calc(VAL) メソッドを実行させたかったら
次のようにインポート文を変更したらいい。
|
package jp.yucchi.static_sample_4; import static jp.yucchi.static_sample_4.hoge.*; import static jp.yucchi.static_sample_4.chage.VAL; import static jp.yucchi.static_sample_4.chage.calc; |
っていうか・・・ hoge クラス使わなきゃいいじゃん(^_^;)
TAGS: Java |
2012年5月18日11:37 AM |
Java
今回も static static Fantastic! だぜ!
今回もなんだこの仕様は(゜o゜; というものが最後にあります。
間違ってるかもしれないけど興味のある方は実際に動かしてみてください。
では static メソッドのインポートについて見てみましょう。
次のコードは static メソッドをインポートして使おうとしています。
しかし、メソッド名が同じなのでコンパイルエラーになります。
jp\yucchi\static_sample_4\hoge.java |
|
package jp.yucchi.static_sample_4; public class hoge { static void calc(int i) { System.out.println(i + "* 2 = " + i * 2); } } |
jp\yucchi\static_sample_4\chage.java |
|
package jp.yucchi.static_sample_4; public class chage { static void calc(int i) { System.out.println(i + "* 3 = " + i * 3); } } |
jp\yucchi\static_sample_4\Static_sample_4.java |
|
package jp.yucchi.static_sample_4; import static jp.yucchi.static_sample_4.hoge.*; import static jp.yucchi.static_sample_4.chage.*; public class Static_sample_4 { public static void main(String[] args) { calc(100); } } |
なんか前回とよく似ていますね。
ってことは・・ ワイルドカードでのインポートをやめてきっちり指定したほうのメソッドが実行されるに違いない。
Static_sample_4.java を次のように変更してみた。
|
package jp.yucchi.static_sample_4; import static jp.yucchi.static_sample_4.hoge.calc; import static jp.yucchi.static_sample_4.chage.*; |
コンパイルされちゃんと実行されるようになります。
run:
100* 2 = 200
構築成功 (合計時間: 0 秒)
疑り深い私はワイルドカードのインポートを次のよう逆に入れ替えてみました。
これで実行結果が 300 となれば間違いない。
|
package jp.yucchi.static_sample_4; import static jp.yucchi.static_sample_4.hoge.*; import static jp.yucchi.static_sample_4.chage.calc; |
run:
100* 3 = 300
構築成功 (合計時間: 0 秒)
間違いなかった。めでたし、めでたし、とここまでだったら前回から想像される内容だ。
では次のコードではどうだろう?(同じじゃないかよ!)
jp\yucchi\static_sample_4\hoge.java |
|
package jp.yucchi.static_sample_4; public class hoge { static void calc(int i) { System.out.println(i + "* 2 = " + i * 2); } } |
jp\yucchi\static_sample_4\chage.java |
|
package jp.yucchi.static_sample_4; public class chage { static void calc(int i) { System.out.println(i + "* 3 = " + i * 3); } } |
jp\yucchi\static_sample_4\Static_sample_4.java |
|
package jp.yucchi.static_sample_4; import static jp.yucchi.static_sample_4.hoge.*; import static jp.yucchi.static_sample_4.chage.*; public class Static_sample_4 { public static void main(String[] args) { calc(100); } } |
コンパイルエラー!
calc() メソッドがどちらを使えばいいのか解らないからですよね。
先述のようにインポート文を変更すれば解決できるのですが今回はちょっと違ったみかたをします。
calc() メソッドの引数を変更してみます。
メソッドオーバーロードで解決できるか試してみます。
次のようにコードを変更します。
jp\yucchi\static_sample_4\chage.java |
|
package jp.yucchi.static_sample_4; public class chage { static void calc(long i) { System.out.println(i + "* 3 = " + i * 3); } } |
このように chage クラスの calc() めそっどの引数を long に変更してみました。
main() メソッドから呼ばれる calc() メソッドの引数は int なのでこれでいけるはず。
さて、どうでしょう?
run:
100* 2 = 200
構築成功 (合計時間: 1 秒)
コンパイルも実行も問題ないですね(^^)
疑り深い私は次のように calc() メソッドの呼び出しを long でやってみました。
コンパイル、実行がちゃんとできるでしょうか?
|
public static void main(String[] args) { calc(100L); } |
run:
100* 3 = 300
構築成功 (合計時間: 0 秒)
問題ないですね。ばっちりOKです。
では、最後に面白いコードを(^^)
ゆっくり画面をスクロールさせてどうなるか考えてみてください。
このプログラムの動作が理解できたらあなたは static import を良く理解できているでしょう。
jp\yucchi\static_sample_4\hoge.java |
|
package jp.yucchi.static_sample_4; public class hoge { static int VAL = 10000; static void calc(int i) { System.out.println(VAL + "* 2 = " + VAL * 2); } } |
jp\yucchi\static_sample_4\chage.java |
|
package jp.yucchi.static_sample_4; public class chage { static int VAL = 1; static void calc(int i) { System.out.println(VAL + "* 2 = " + VAL * 2); } } |
jp\yucchi\static_sample_4\Static_sample_4.java |
|
package jp.yucchi.static_sample_4; import static jp.yucchi.static_sample_4.hoge.*; import static jp.yucchi.static_sample_4.chage.VAL; public class Static_sample_4 { public static void main(String[] args) { calc(VAL); } } |
run:
10000* 2 = 20000
構築成功 (合計時間: 0 秒)
コンパイルも実行もされます。
calc() メソッドの引数は int で同じなのにね(゜o゜;
でも、実行結果が・・・
chage クラスの VAL が優先されるから実行結果は 2 となると思っていた。
static import 奥が深いぜ!
誰か詳しく優しく説明しておくれ~
TAGS: Java |
2012年5月18日7:53 AM |
Java
今回も static static Fantastic だぜ!
前回、 static import の使い方を覚えた。
しかし、次のようなコードだとコンパイルエラーになる。
jp\yucchi\static_sample_3\Kyouko.java |
|
package jp.yucchi.static_sample_3; /** * * @author Yucchi */ public class Kyouko { public static int BUST = 86; public static int WAIST = 62; public static int HIP = 88; } |
jp\yucchi\static_sample_3\Meisa.java |
|
package jp.yucchi.static_sample_3; /** * * @author Yucchi */ public class Meisa { public static int BUST = 80; public static int WAIST = 60; public static int HIP = 85; } |
jp\yucchi\static_sample_3\Static_sample_3.java |
|
package jp.yucchi.static_sample_3; import static jp.yucchi.static_sample_3.Kyouko.*; import static jp.yucchi.static_sample_3.Meisa.*; /** * * @author Yucchi */ public class Static_sample_3 { public static void main(String[] args) { System.out.println("Kyouko のバストは " + BUST + "センチです。"); } } |
|
<font size="4">BUST が Kyouko.BUST か Meisa.BUST か解らないからだろう。</font> |
|
<font size="4">しかし、import 文のワイルドカード(スターインポート)を Kyouko クラスだけ変更してみる。</font> |
|
package jp.yucchi.static_sample_3; import static jp.yucchi.static_sample_3.Kyouko.BUST; import static jp.yucchi.static_sample_3.Meisa.*; |
上記のように変更してもコンパイルエラーになると思っているあなた!なんと、コンパイルされてしかもちゃんと実行されます。(゜o゜;
run:
Kyouko のバストは 86センチです。
構築成功 (合計時間: 0 秒)
なんか不思議だ。
どうしてこんな仕様になったのか猿でも解る説明を誰かしておくれ。
TAGS: Java |
2012年5月15日10:51 PM |
« 古い記事
新しい記事 »