2013年 4月

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

Java

以前に 「Java 8 Date and Time API の素敵なコード」というタイトルをエントリーした。

今回はちょっとだけ感動を覚えるコードを紹介します。

なんと日本の Java Programmer の胸を熱くすること間違い無しのこれだ!

そして我々は胸を熱くするであろう出力結果をみることになる。

Seireki
Meiji
Taisho
Showa
Heisei

慶応はさすがに無いけど十分だ!

Java8 ありがとう! 私は来年の3月18日まで首を長くして待ってるよ。(*^o^*)

Technorati タグ:

もっと Lambda その4

Java

正式版のリリースが2014年3月18日に延期された Java8 の Lambda を今回も楽しんでみます。

いつものようにネットから情報を取得して少しコードを変えて動かしているだけの写経のようなことをやってます。

詳しいことは解らないけど慣れるってことが目的です!

今回はデザインパターンの一つである Template Method Pattern を Lambda を使って実装してみる試みです。

Template Method Pattern について知りたければグーグル先生に聞いてみたらいっぱい答えを教えてくれます。

Wikipedia では、Template Method パターン(テンプレート・メソッド・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。

「振る舞いに関するパターン」に属する。Template Method パターンの目的は、ある処理のおおまかなアルゴリズムをあらかじめ決めておいて、

そのアルゴリズムの具体的な設計をサブクラスに任せることである。

そのため、システムのフレームワークを構築するための手段としてよく活用される。

と記載されてます。

今回のサンプルは現在の日付とそれぞれ30日後、60日後の日付を表示させ、ついでにつまらないメッセージも表示させるだけです。

それでは Lambda を使わないプログラムです。(Java8 の新機能の Date and Time API は使ってます。)

 

実行結果は次のようになります。

今日は 2013-04-30 です。
30日後は2013-05-30 です。
ワイルドだろぅ ごめんね。こんなサンプルで (ノД`)

今日は 2013-04-30 です。
60日後は2013-06-29 です。
ワイルドだろぅ ごめんね。こんなサンプルで (ノД`)

当然の結果で何も問題ないですね。

実際にはこのような実装は無いかと思いますが一応 Template Method Pattern の定義に沿っているのでよしとしてください。

それではこのコードを Java8 の Lambda を使うとどうなるか?

こんなになりました~! (*^o^*)

 

実行結果は次のようになります。

今日は 2013-04-30 です。
30日後は2013-05-30 です。
ワイルドだろぅ ごめんね。こんなサンプルで (ノД`)

今日は 2013-04-30 です。
60日後は2013-06-29 です。
ワイルドだろぅ ごめんね。こんなサンプルで (ノД`)

こちらも当然の結果で何も問題ないですね。

Lambda を使うと本当にシンプルになります。

「抽象クラスを使ってないじゃないか!」って怒らないでね。(^_^;)

DateInterface (FunctionalInterface) での Default Methods が使えるのが良いですね。

これって Java で禁じ手の多重継承を可能にするような掟破りの裏技のような気がします。

なかなか面白いですね。(^_^)

それでは、お約束の時間です。

この「もっと Lambda 」シリーズは、インターネット上で得た情報を元にそれを少し変更しているだけです。

悲しいことにその情報源は英語なので詳しい内容はわかりません。

よって私の推測で解釈された内容となってますので間違いがあると思います。

Java8 もまだ build86 を使用していますので API の変更により記述方法が変わるかもしれません。

早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。

cludia_2013_04_30_001

Hatena タグ:

Java8 の Arrays.parallelSort() を試してみた

Java

Java8 では Arrays.parallelSort() が導入される予定だ。

どうやら Fork/Join Framework を使っているようです。

今まではプリミティブ型はデュアルピボットのクイックソートで参照型は Tim ソートだったような記憶があります。

この記憶の信憑性はかなり低いので間違っていても怒らないでくださいね(^_^;)

そこで早速試してみることにします。

コードはシンプルなソートです。

jp\yucchi\parallelsort\ParallelSort.java

全てのソート時間の取得と表示、そして11回目からのソート処理平均時間の取得と表示をそれぞれ

Arrays.parallelSort() と Arrays.sort() で実行してます。

このプログラムの実行結果は概ね予測できますが下記に実行結果を貼っておきます。

1回目 : Arrays.parallelSortの処理時間は、0時間0分4秒4152691810000002

2回目 : Arrays.parallelSortの処理時間は、0時間0分3秒1656751470000004

3回目 : Arrays.parallelSortの処理時間は、0時間0分3秒4398564410000003

4回目 : Arrays.parallelSortの処理時間は、0時間0分3秒18688716800000016

5回目 : Arrays.parallelSortの処理時間は、0時間0分3秒4902016290000004

6回目 : Arrays.parallelSortの処理時間は、0時間0分3秒1557479500000003

7回目 : Arrays.parallelSortの処理時間は、0時間0分3秒5248610990000002

8回目 : Arrays.parallelSortの処理時間は、0時間0分3秒21521467700000008

9回目 : Arrays.parallelSortの処理時間は、0時間0分3秒4352946820000003

10回目 : Arrays.parallelSortの処理時間は、0時間0分3秒176553014

11回目 : Arrays.parallelSortの処理時間は、0時間0分3秒5098383400000004

12回目 : Arrays.parallelSortの処理時間は、0時間0分3秒2292058370000003

13回目 : Arrays.parallelSortの処理時間は、0時間0分3秒4357429300000004

14回目 : Arrays.parallelSortの処理時間は、0時間0分3秒20676435400000015

15回目 : Arrays.parallelSortの処理時間は、0時間0分3秒45285167800000004

16回目 : Arrays.parallelSortの処理時間は、0時間0分3秒2242083810000004

17回目 : Arrays.parallelSortの処理時間は、0時間0分3秒4621416820000004

18回目 : Arrays.parallelSortの処理時間は、0時間0分3秒5754989530000003

19回目 : Arrays.parallelSortの処理時間は、0時間0分3秒500453534

20回目 : Arrays.parallelSortの処理時間は、0時間0分3秒21473901200000034

<—– Arrays.parallelSortの平均処理時間は、0時間0分3秒3811444700000002 —–>

1回目 : Arrays.sortの処理時間は、0時間0分48秒9387049350000041

2回目 : Arrays.sortの処理時間は、0時間0分48秒9633070610000019

3回目 : Arrays.sortの処理時間は、0時間0分49秒015938085000001934

4回目 : Arrays.sortの処理時間は、0時間0分48秒9707528720000056

5回目 : Arrays.sortの処理時間は、0時間0分49秒2902336700000063

6回目 : Arrays.sortの処理時間は、0時間0分48秒9888089870000059

7回目 : Arrays.sortの処理時間は、0時間0分48秒9633770900000016

8回目 : Arrays.sortの処理時間は、0時間0分48秒9997757110000052

9回目 : Arrays.sortの処理時間は、0時間0分48秒9295900030000013

10回目 : Arrays.sortの処理時間は、0時間0分49秒08955452700000421

11回目 : Arrays.sortの処理時間は、0時間0分50秒13118777600000442

12回目 : Arrays.sortの処理時間は、0時間0分49秒8455564950000038

13回目 : Arrays.sortの処理時間は、0時間0分49秒24517728500000402

14回目 : Arrays.sortの処理時間は、0時間0分49秒12246824000000345

15回目 : Arrays.sortの処理時間は、0時間0分48秒901129044000001

16回目 : Arrays.sortの処理時間は、0時間0分49秒40450923900000646

17回目 : Arrays.sortの処理時間は、0時間0分50秒7024559510000046

18回目 : Arrays.sortの処理時間は、0時間0分49秒7857455720000033

19回目 : Arrays.sortの処理時間は、0時間0分50秒1460985550000018

20回目 : Arrays.sortの処理時間は、0時間0分51秒37098508900000127

<—– Arrays.sortの平均処理時間は、0時間0分49秒8655313240000027 —–>

Arrays.parallelSort() が3秒前半のスコアに対して Arrays.sort() は、ほぼ 50 秒かかってます。

予想通り Arrays.parallelSort() が圧倒的に高速ですね。(^_^)

その秘密は NetBeans のプロファイラで確認しました。

内部で Fork/Join Framework が使われてるのが確認されました。

1

Java は並行処理を簡単に実行できるようにいろいろがんばって作られてるようです。

ちなみに、アレイのサイズを21億個まで増大させたときのプログラムの実行結果は次のようになりました。

1回目 : Arrays.parallelSortの処理時間は、0時間0分26秒7820320810000005

2回目 : Arrays.parallelSortの処理時間は、0時間0分14秒215850219

3回目 : Arrays.parallelSortの処理時間は、0時間0分15秒21248125400000006

4回目 : Arrays.parallelSortの処理時間は、0時間0分14秒17695699800000142

5回目 : Arrays.parallelSortの処理時間は、0時間0分15秒21644380900000115

6回目 : Arrays.parallelSortの処理時間は、0時間0分14秒13889982600000117

7回目 : Arrays.parallelSortの処理時間は、0時間0分15秒3859477300000016

8回目 : Arrays.parallelSortの処理時間は、0時間0分14秒15733845600000151

9回目 : Arrays.parallelSortの処理時間は、0時間0分15秒042537343000001115

10回目 : Arrays.parallelSortの処理時間は、0時間0分14秒10847939100000126

11回目 : Arrays.parallelSortの処理時間は、0時間0分15秒31738622100000136

12回目 : Arrays.parallelSortの処理時間は、0時間0分14秒09331228100000111

13回目 : Arrays.parallelSortの処理時間は、0時間0分15秒23933288000000097

14回目 : Arrays.parallelSortの処理時間は、0時間0分14秒09788163900000058

15回目 : Arrays.parallelSortの処理時間は、0時間0分15秒2869010420000002

16回目 : Arrays.parallelSortの処理時間は、0時間0分14秒1130110920000007

17回目 : Arrays.parallelSortの処理時間は、0時間0分15秒037243257000000085

18回目 : Arrays.parallelSortの処理時間は、0時間0分14秒1627590560000005

19回目 : Arrays.parallelSortの処理時間は、0時間0分15秒16421842200000114

20回目 : Arrays.parallelSortの処理時間は、0時間0分14秒3338693370000012

<—– Arrays.parallelSortの平均処理時間は、0時間0分14秒6845915220000016 —–>

1回目 : Arrays.sortの処理時間は、0時間3分46秒10638811700002293

2回目 : Arrays.sortの処理時間は、0時間3分45秒5415704870000013

3回目 : Arrays.sortの処理時間は、0時間3分44秒14708787200001439

4回目 : Arrays.sortの処理時間は、0時間3分44秒28659846600001515

5回目 : Arrays.sortの処理時間は、0時間3分44秒2646577520000051

6回目 : Arrays.sortの処理時間は、0時間3分43秒6922063590000107

7回目 : Arrays.sortの処理時間は、0時間3分43秒25756076300001496

8回目 : Arrays.sortの処理時間は、0時間3分44秒48740214200000764

9回目 : Arrays.sortの処理時間は、0時間3分42秒6569463620000136

10回目 : Arrays.sortの処理時間は、0時間3分42秒32911070500000505

11回目 : Arrays.sortの処理時間は、0時間3分41秒22716906600001607

12回目 : Arrays.sortの処理時間は、0時間3分41秒819911870000027

13回目 : Arrays.sortの処理時間は、0時間3分41秒3822147500000028

14回目 : Arrays.sortの処理時間は、0時間3分41秒0946705690000158

15回目 : Arrays.sortの処理時間は、0時間3分42秒02558318500001633

16回目 : Arrays.sortの処理時間は、0時間3分51秒4318844270000284

17回目 : Arrays.sortの処理時間は、0時間3分52秒048210971000003155

18回目 : Arrays.sortの処理時間は、0時間3分52秒01929548700002215

19回目 : Arrays.sortの処理時間は、0時間3分52秒04963036800000964

20回目 : Arrays.sortの処理時間は、0時間3分52秒09709150600002658

<—– Arrays.sortの平均処理時間は、0時間3分46秒7195662190000007 —–>

Java8 の正式リリースが待ち遠しいです!

ちなみに 9 月 9 日にリリース予定だったのですが、どうやら遅れそうです。

ツイッター上では 2014 年になるとか・・・つぶやかれていました。

今のうちにもっと情報集めて Java8 をしっかり楽しめるようにがんばってみるとしよう。(*^o^*)

Hatena タグ:

 


もっと Lambda その3

Java

今日も Java8 の新機能に慣れるべくいつものようにネットサーフィンで得た情報を試してみます。

今回は前回チラッと現れたSupplier インターフェイスと Constructor References をためしてみようと思います。

非常に簡単でシンプルな内容なのです。ラムダ式を使う方法とコンストラクターリファレンスを使う方法を記述してます。

それを Supplier インターフェイスの get() メソッドで取得してそれぞれのインスタンスメソッドを実行させているだけです。

特に難しいところは無さそうですが、この使い分けのシチュエーションは微妙かもしれませんね。

では、プログラムのコードです。

mylambdaexamples_3\Airplane.java

mylambdaexamples_3\JetAirplane.java

mylambdaexamples_3\MyLambdaExamples_3.java

実行結果は次のようになります。

飛行機を操縦します。
ジェット機を操縦します。
飛行機を操縦します。
ジェット機を操縦します。

Java の学習の初めのころにこのような感じのをやったようなデジャブを感じます。

いちおう JavaDoc をサラッと見てみます。

いつものように優秀な翻訳支援ソフトに活躍してもらいます。(>_<。)

 

Supplier

java.​util.​function

@FunctionalInterface
public interface Supplier<T>

A supplier of objects. The result objects are either created during the invocation of Supplier.get or by some prior action.

パラメータ:

T – The type of objects returned by get

日付:

1.8

オブジェクトのサプライヤ。 オブジェクトが Supplier.get の呼出しの間に、あるいは若干の事前のアクションによってあるいは作り出されるという結果。

パラメータ: get によりオブジェクトのタイプが返される。

 

get()

java.​util.​function.​Supplier

public T get()

Returns an object.

戻り値:

an object

オブジェクトを返します。

 

特に難しいところは無さそうですね。強いて言うなら英語の JavaDoc か・・・

そういうことでそろそろお約束の時間です。

この「もっと Lambda 」シリーズは、インターネット上で得た情報を元にそれを少し変更しているだけです。

悲しいことにその情報源は英語なので詳しい内容はわかりません。

よって私の推測で解釈された内容となってますので間違いがあると思います。

Java8 もまだ build86 を使用していますので API の変更により記述方法が変わるかもしれません。

早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。

 

Hatena タグ:

もっと Lambda その2

Java

今日も Java8 の新機能に慣れるべくネットから情報収集したものを試してみます。

今回の情報源も外国語のサイトなので詳しいことは理解できませんでしたが雰囲気だけでも感じてみたいと思います。(なんのこっちゃ?

ってな訳で今回は「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズでもお馴染みの Optional です。

前はストリームでゴニョゴニョしていたので今回は素のままで。

シンプルなコードなのでだいたいのことは解るような気がします。

mylambdaexamples_2\Person.java

mylambdaexamples_2\MyLambdaExamples_2.java

今回また見慣れないメソッドがでてきました。

JavaDoc をちらっと見てみましょう。

 

ifPresent()

java.​util.​Optional

public void ifPresent(Consumer<? super T> consumer)

Have the specified consumer accept the value if a value is present, otherwise do nothing.

パラメータ:

consumer – block to be executed if a value is present

スロー:

NullPointerException – if value is present and consumer is null

指定された consumer が、もし値が存在しているなら、値を受けとって、さもなければ何もしないようにしてください。

パラメータ: もし値が存在しているなら、ブロックが実行されます。

 

orElse()

java.​util.​Optional

public T orElse(T other)

Return the value if present, otherwise return other.

パラメータ:

other – the value to be returned if there is no value present, may be null

戻り値:

the value, if present, otherwise other

値が存在するならばそれを、存在しないなら他を

パラメータ: 他の値が存在しない場合返される値は null かもしれない。

いつものことだけど翻訳支援ソフトって微妙・・・

 

orElseGet()

java.​util.​Optional

public T orElseGet(Supplier<? extends T> other)

Return the value if present, otherwise invoke other and return the result of that invocation.

パラメータ:

other – a Supplier whose result is returned if no value is present

戻り値:

the value if present otherwise the result of other.get()

スロー:

NullPointerException – if value is not present and other is null

もし存在しているなら、値を返して、さもなければotherを呼び出して、そしてその呼出しの結果を返してください。

パラメータ: 値ではなく、その結果が返されるサプライヤが存在しています

 

of()

java.​util.​Optional

public static <T> Optional<T> of(T value)

Return an Optional with the specified present value.

パラメータ:

value – the value to be present, which must be non-null

戻り値:

an Optional with the value present

指定された現在の値でオプションを返してください。

パラメータ: 値が存在しています。それは null であってはいけない。

 

empty()

java.​util.​Optional

public static <T> Optional<T> empty()

Returns an empty Optional instance. No value is present for this Optional.

型パラメータ:

T – Type of the non-existent value

戻り値:

an empty Optional

空の Optional インスタンスを返します。 値なしはこの Optional のために存在しています。

型パラメータ: 実在しない値のタイプ

 

英語じゃなくて日本語の JavaDoc がいいなぁ・・・

以上のことを踏まえてコードを見てみると、名前で検索かけてヒットしたら”みっけ”と名前を表示。

38 行目の検索ではヒットしないので ”いない” と orElse(T other) によって権兵衛が表示されます。

orElse(T other) はデフォルト値を返すために使われるようです。

42 行目の検索でもヒットしないので ”いない” と orElseGet(Supplier<? extends T> other) によって太郎が表示される。

orElseGet(Supplier<? extends T> other) は、もし optional のオブジェクトが空であるなら、究極的にデフォルトの答えを提供することができるサプライヤを提供するために使います。

ちょっと面倒な例外処理のようですね。

さて、このプログラムの実行結果を一応載せておきますね。

 

<– Person 表示 –>
柴田 恭平, 61歳, Gender: MALE
壇 蜜, 32歳, Gender: FEMALE
北川 景子, 26歳, Gender: FEMALE
綾瀬 はるか, 28歳, Gender: FEMALE
佐々木 希, 25歳, Gender: FEMALE
剛力 彩芽, 20歳, Gender: FEMALE
小栗 旬, 30歳, Gender: MALE
堀北 真希, 24歳, Gender: FEMALE
武井 咲, 19歳, Gender: FEMALE
市原 隼人, 26歳, Gender: MALE
深田 恭子, 30歳, Gender: FEMALE

みっけ
はるか

いない
権兵衛

いない
太郎

今回も未来の素敵なコードの欠片を試すことができました。

英語が良く解らないので仕組みがいまいち理解できないのがちょっと残念だけどゆっくりぼちぼちと楽しんで覚えていこう!(^_^)

それではお約束です。

この「もっと Lambda 」は、インターネット上で得た情報を元にそれを少し変更しているだけです。

悲しいことにその情報源は英語なので詳しい内容はわかりません。

よって私の推測で解釈された内容となってますので間違いがあると思います。

Java8 もまだ build85 を使用していますので API の変更により記述方法が変わるかもしれません。

早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。

 

Hatena タグ:

« 古い記事