2013年 6月

もしかしたら代入に失敗するかもしれない

Java

今日 Twitter で見かけた素晴らしいコードに感動しました。


そこで私も Java8 で創ってみました。

実行結果は次のようになります。
ただ、本当に代入に失敗したかどうかは解りませんw

7

さすがにログをとって何回もとは思いませんでした。
誰かもっと安心できるコードをご存じでしたらご教示お願いいたします。

Hatena タグ:

もっと Lambda その18

Java

昨日のエントリーの解答を載せておきます。

10
8
0
4
2
6

上記のように 0 から 10 までの偶数が表示されます。

出力される順番はプログラムが実行される環境により変わります。

これは parallel() メソッドにより平行ストリームとして処理されるからです。

JavaDOC では下記のようになってます。

java.​util.​stream.​IntStream

public IntStream parallel()

Returns an equivalent stream that is parallel. May return itself, either because the stream was already parallel, or because the underlying stream state was modified to be parallel.

This is an intermediate operation.

戻り値:

a parallel stream

それでは順序よく 0 から 10 までの偶数を表示させるにはどうすればいいでしょうか?

そんな我が儘なあなたに使って欲しいメソッドが用意されてます。

java.​util.​stream.​IntStream

public void forEachOrdered(IntConsumer action)

Performs an action for each element of this stream, guaranteeing that each element is processed in encounter order for streams that have a defined encounter order.

This is a terminal operation.

パラメータ:

action – a non-interfering action to perform on the elements

参照:

IntStream.forEach(IntConsumer)

 

これを使って昨日のプログラムを変更してみます。

ついでにメソッドリファレンスを使うように変更しました。

実行結果は期待通りに順序よく出力されます。

0
2
4
6
8
10

検証はしてないのですがコストが高くなるようなので使いどころを誤らないようにしなければいけないようです。

簡単なパズルでしたけどなんでもいいから平行ストリーム使っちゃえ!ってやってたらはまる可能性がありますね。(私のような単純で純粋なひとはw)

Hatena タグ:

もっと Lambda その17

Java

今日も Java8 ネタです。

すでに Lambda のメーリングリストでやりとりされていたネタを Java パズルとして出題します。

次のプログラムを実行するとどうなるでしょうか?

超ウルトラ簡単なパズルです。

答えは気が向いたら投稿するかもしれません。

あしからず・・・

Hatena タグ:

もっと Lambda その16

Java

Java Platform, Standard Edition 8 Early Access with Lambda Support b94 の optional クラスに filter map flatMap など愉快な仲間達が追加されたようです。

早速試してみました。

ネタ元はこちらです。

Java8でのプログラムの構造を変えるOptional、ただしモナドではない

この記事ではモナドについて触れられてますが私はモナドさっぱり解りません。

それって最中の親戚で甘くて美味しいの?ってレベルです。(^_^;)

それではまるっとコードを美味しくいただいて動くかどうか試してみます。

コードはいつものデータを利用します。

無駄に長いです。

<– Person  –>
柴田 恭平, 61歳, Gender: MALE   体重 : 70   評価 : 8
壇 蜜, 32歳, Gender: FEMALE   体重 : 60   評価 : 6
北川 景子, 26歳, Gender: FEMALE   体重 : 55   評価 : 7
綾瀬 はるか, 28歳, Gender: FEMALE   体重 : 50   評価 : 4
佐々木 希, 25歳, Gender: FEMALE   体重 : 48   評価 : 9
剛力 彩芽, 20歳, Gender: FEMALE   体重 : 45   評価 : 6
小栗 旬, 30歳, Gender: MALE   体重 : 65   評価 : 3
堀北 真希, 24歳, Gender: FEMALE   体重 : 45   評価 : 10
武井 咲, 19歳, Gender: FEMALE   体重 : 50   評価 : 5
市原 隼人, 26歳, Gender: MALE   体重 : 67   評価 : 2
深田 恭子, 30歳, Gender: FEMALE   体重 : 50   評価 : 8

上記のリストで一番若い男性のもとへ一番若い女性がお嫁入りするとしてその女性の新しい姓名を表示させてみます。

ほげほげ@ちょめちょめ ってね。

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

市原

市原@咲

期待通りに動いてるけどこれが可能になることが Java な人には重要なことなんだろうか?

モナドを美味しくいただけくことができない私にはイマイチ理解ができないです。

もしこれが重要なことだとしたらそのうち誰かが記事にして熱く語ってくれるだろう。

Hatena タグ:

もっと Lambda その15

Java

今日のエントリーも Java8 ネタです。

このところ Java8 のエントリーがほとんどになってきたけど Lambda をはじめ、新機能がよく理解できてないので慣れることを目標としてます。(^_^;)

今回は無理矢理 Java8 を使って有名なナップサック問題を解くプログラムを創ってみました。

それでは下記のようなデータの人たちがいるとします。

<– Person  –>
柴田 恭平, 61歳, Gender: MALE   体重 : 70   評価 : 8
壇 蜜, 32歳, Gender: FEMALE   体重 : 60   評価 : 6
北川 景子, 26歳, Gender: FEMALE   体重 : 55   評価 : 7
綾瀬 はるか, 28歳, Gender: FEMALE   体重 : 50   評価 : 4
佐々木 希, 25歳, Gender: FEMALE   体重 : 48   評価 : 9
剛力 彩芽, 20歳, Gender: FEMALE   体重 : 45   評価 : 6
小栗 旬, 30歳, Gender: MALE   体重 : 65   評価 : 3
堀北 真希, 24歳, Gender: FEMALE   体重 : 45   評価 : 10
武井 咲, 19歳, Gender: FEMALE   体重 : 50   評価 : 5
市原 隼人, 26歳, Gender: MALE   体重 : 67   評価 : 2
深田 恭子, 30歳, Gender: FEMALE   体重 : 50   評価 : 8

あなたはヨットをもっていてクルージングを楽しもうとしています。

上記の人たちが「是非ご一緒させてください」と申し出てきました。

ヨットの制限であと 180 キログラムまでしか乗船できません。

そこであなたは、女性を同伴させることにします。

重量制限のあるなか、あなたは女性の評価値の総和が最大になるように同伴メンバーを選ばなくてはなりません。

今回はヨットであり、希望者も少ないのでわざわざプログラムを組む必要はないでしょう。

しかし、ある日突然大金持ちになって豪華客船でクルージングなんてことがあるかもしれません。(ヲヒ

プログラムの内容は 0-1 ナップサック問題 動的計画法アルゴリズムで良く知られているから解説はしません。

Java8 だとこんな風に組めるのかくらいに斜めにみてください。

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

合計評価 : 27
佐々木 希    年齢 : 25    Gender : FEMALE   体重 : 48   評価 : 9
堀北 真希    年齢 : 24    Gender : FEMALE   体重 : 45   評価 : 10
深田 恭子    年齢 : 30    Gender : FEMALE   体重 : 50   評価 : 8

間違っているかもしれません。そのときは優しくご指摘くださいませ。

Java8 に詳しい方は「ここはこうすれば良いのにとかあればコソッとコメント入れといてくれると嬉しいです。」 なんてね。(^_^)

*注意* 2013年7月2日 API 使用変更に対応、ついでに選んだ人の情報取得方法を Optional と Person を使う二種類記述しました。

cludia_2013_06_08_001

Hatena タグ:

« 古い記事