Java

もっと Lambda その11

Java

Java8 でパズルを創ってしまいました。

Java™ Platform, Standard Edition 8 Early Access with Lambda Support b88 で創りました。

簡単なパズルです。

低レベルなものですが、よければあなたの頭脳をもってしてコンパイル、実行してみてください。(^_^)

とても素敵な答えが見つかるでしょう。(^_^;)

解りましたでしょうか?

答えは秘密にしておきますので気になる方は実際にコンパイル、実行させてみてくださいね。

Hatena タグ:

もっと Lambda その10

Java

もっと Lambda シリーズも今回で10回目になりました。

と言っても大した内容ではないので恐縮です。

私のモットーは「門前の小僧習わぬ経を読む」ですから気にせずガンガンいっちゃいます!

今回はストリームオブジェクトの重複要素を排除して新たにストリームオブジェクトを作り直す便利な方法を紹介します。

とても簡単なので覚えておいて損はないと思います。

では、非常にシンプルなプログラムをご覧ください。

 

distinct() メソッドが重複排除して新たなストリームオブジェクトを返してくれるんですねぇ~(^_^)

たったこれだけです!

distinct()

ava.​util.​stream.​Stream

public Stream<T> distinct()

Returns a stream consisting of the distinct elements (according to Object.equals(Object)) of this stream.

This is a stateful intermediate operation.

戻り値:
the new stream

 

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

HONDA
TOYOTA
NISSAN
MAZUDA

 

便利だね。

調子に乗って二つのリストオブジェクトを結合して重複要素を排除して新たにストリームオブジェクトをつくってみましょう。

 

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

喜屋武ちあき
櫻井里佳
谷澤恵里香
倉持明日香
戸田恵梨香
新垣結衣
吉高由里子
宮崎あおい
篠田麻里子

ちなみに distinct() メソッド無しだと重複要素は排除されません。

Java8 が正式リリースされて何らかの理由によって Java7 を使わなくてはいけない状況があるとすればそれは気の毒としか言いようがないですね。

Hatena タグ:

もっと Lambda その9

Java

ずっとブログの更新さぼってました。

いろいろネタはあるのですが忙しい毎日を理由の一つとしておきましょう。( ̄。 ̄;)

それと体の調子が良くなくて病に倒れてました。

なんとか復活したので Java8 のエントリーをサクッとポストしようかとがんばってみます。

Java Day Tokyo 2013 が開催されてから日本語での Java8 の情報がちらほら見受けられるようになって嬉しいですね。

ということで、「もっと Lambda」シリーズです。

今回は今まで使ったことが無い flatMap を使ってみます。

実はこの flatMap の使いどころが良く解らずにいたのですが「創る Java」の著者である きしださんのブログにて説明があり、

いくつかのリストを組み合わせて一つのリストを創りたい場合に使えるとのことでした。

JavaDoc を参考までに

flatMap()

java.​util.​stream.​Stream

public Stream flatMap(Function> mapper)

Returns a stream consisting of the results of replacing each element of this stream with the contents of the stream produced by applying the provided mapping function to each element. If the result of the mapping function is null, this is treated as if the result is an empty stream.

This is an intermediate operation.

パラメータ:
mapper – a non-interfering, stateless function to apply to each element which produces a stream of new values

型パラメータ:
R – The element type of the new stream

戻り値:
the new stream

 

早速試してみました。

女性の名前に”さん”をつけるだけのプログラムです。

filter(e -> e.getGender() == Person.Sex.FEMALE) で女性だけ対象として

map(Person::getLastName) で名前でストリームオブジェクトを再構築し、

flatMap(e -> Arrays.asList(e.concat(“さん”)).stream()) で”さん”を付け足して新たにストリームオブジェクトを再構築してできあがり。(^_^)

”さん”を付けるだけのプログラムならこんなことはしなくてもいいけど名前に”さん”を付けたストリームオブジェクトを新たに必要とするときに便利かもしれませんね。

実行結果は期待通りです。

<– 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
蜜さん
景子さん
はるかさん
希さん
彩芽さん
真希さん
咲さん
恭子さん

Java8 のリリースが来年の2月に変更になったようです。

たしか Future Complete が2.3日前の予定だったような・・・

いずれにせよ、早くリリースしてほしいです。

Hatena タグ:

もっと Lambda その8

Java

今日は久しぶりに? Java8 の目玉機能の Lambda のエントリーです。

くどいようですがまだまだ引っ張ります。

来年の3月18日なんてあっと言う間にやってきます。

今回はちょっと便利な機能を紹介します。

「もっと Lambda その5」で紹介した機能が API の仕様変更になったようで使えなくなりました。

今回は仕様変更されたコードを紹介します。そのおまけとしてステップ数も追加してみました。

1 から 10 までをステップ数 2 で表示する超シンプルなプログラムです。

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

13579

期待通りの結果ですね。(^^)

何気に便利に使えるかも!

Hatena タグ:

円周率を Machin’s formula で求める

Java

一年近く前に円周率をモンテカルロ法を利用して求めるプログラムを組んだ。

今回は マチンの公式 ( Machin’s formula ) を利用してみようと思う。

そして桁数と精度も上げてみたいと思ってこの方法を選択してみた。

まず、マチンの公式とは次のようになっている。

ifrm0001

この公式の証明は三角関数の公式を利用して証明できます。

倍角公式を二度使い、加法定理でとどめを刺して終わりです。

詳しくはググってみてください。

それではプログラムをこれにそって組んでみましょう。

プログラムを組むにあたって都合の良いように式を変えてあります。( 6 行目 )

このプログラムでは arcTan(double x) の n 番目 (i + i + 1) の項が 0 になるまで計算をします。

十分小さな値をとるまでに変更する場合は、if 文の条件は絶対値をとるように変更すればいいでしょう。

さて、このプログラムの実行結果を確認してみましょう。

3.141592653589794

最後の桁が 3 であるところが 4 になってます。

モンテカルロ法より速くて精度は高いですね。

でも、もっと桁数をとりたくないでしょうか?

そこで、このプログラムを次のように変更してみました。

百万桁の計算をさせるために BigDecimal を使ってみました。

基本的に先ほどのプログラムと同じです。

ちょっと処理時間が気になるので時間計測をいれてます。

と言っても百万桁も計算させると凄く時間がかかってしまうのは解りきっていることなので一万桁で試してみます。

普段使う機会が少ない BigDecimal を使ってますのでちょっとおかしいところがあるかもしれませんが気にしないでね。(^_^;)

あと、桁数を多くとるので 0 収束を使うと非常に時間がかかってしまうので誤差がでないように適当にループさせてます。

それではいつものように未熟で汚いコードですがご覧ください。

少しでも計算時間が短くなればいいなぁって思って悪あがきしてます。( ̄。 ̄;)

基本的な考え方は double 仕様のものと一緒で悪あがきの並行処理を取り入れただけです。

実行結果の抜粋を載せておきます。

<— 円周率計算開始 —>

10000桁の円周率は、
3.1415926535897932384626433832795028841971693993751058209749445923078164062

4988727584610126483699989225695968815920560010165525637568

10000桁の円周率計算時間は、0時間3分22秒4562651430000244

<— 円周率計算終了 —>

ちゃんと計算できてますね。

一番最後は丸めによって四捨五入されてます。

もっと効率よくプログラムを組むには収束値を設定したほうがいいのかなぁ・・・?

でも、速くても計算が甘くなるのはいやだ!

とりあえず昨年作ったモンテカルロ法で円周率を求めるプログラムより遙かに良いのは確かだ!

あと気のせいかもしれないが BigDecimal の除算って遅く感じる。

ゴールデンウィークの最後の休日にこんなことしているってのは平和でいいね。(^_^)

平成25年5月8日(水) 追記 計算のループの回数を決めている LIMIT_NUMBER の値を変更しました。

10000 桁で確認したところ問題なさそうでした。

ただし、それより大きな桁は確認していませんのであしからず。(;´Д`)

Hatena タグ:

« 古い記事 新しい記事 »