JDK8 Lambda その他いろいろ なんでもいいから動かしてみる その9

今日もはじまります。

JDK8 Lambda その他いろいろ なんでもいいから動かしてみる 最終回です。

やっと終わるのかと思っている人もいるかもしれませんね。

では、最終回のお題は 最も一番売れた商品 を表示させてみます。

このプログラムのコードは下記のようになります。

mylambdaexamples\MyLambdaExamples.java
// 最も一番売れた商品
System.out.println("\n<-- 最も一番売れた商品 -->");
ToIntFunction>> toSize = (e -> e.getValue().size());
Optional mostBought;
mostBought = sales.collect(groupingBy(Sale::getWristwatch))
        .entrySet()
        .stream()
        .sorted(comparing(toSize).reverseOrder())
        .map(Entry::getKey)
        .findFirst();
if (mostBought.isPresent()) {
    System.out.println(mostBought.get().getBrand()
            + "  " + mostBought.get().getModel());
}

今回もシンプルなコードで実装されてます。素敵です!(*^o^*)

116 行目で Wristwatch をキーに List<Sale> を値とし、Wristwatch ごとに売れた個数を( int 値 ) を toSize に格納、

117 行目で Optional<Wristwatch> mostBought を宣言

118 行目から sales ストリームを Sale クラスの getWristwatch() メソッドで取得した wristwatch でグルーピングしてリダクションし、

マップに格納されているマッピングのセットビューを返し、それをストリームにしなおして toSize を引数にして sorted() メソッドでソートしたものをリバースさせ、

map() メソッドの引数にエントリに対応するキーを渡してストリームを構築しなして、findFirst() メソッドで最初の要素(最も一番売れた商品)を取得。

124 行目で mostBought に最初の要素があるか isPresent() メソッドで判定し、

125 行目でその要素のブランド名とモデル名を表示させてます。

ちょっとややこしく感じるかもしれませんがこれだけの処理をこれだけ簡潔に記述できるって素敵だと思いませんか?

疑り深いあなたの為に実行結果は次のようになります。

 

<– 最も一番売れた商品 –>
ティファニー  ポーセリン

あってますね。

ちなみに、この ティファニー ポーセリン は私の好きな腕時計の一つです。

誰か持ってていらない人は私に無償でプレゼントしてください!

壊れてて動かなくても OK です!

おっと、いけない。かなり私情がはいってしまった。(;´∀`)

ついでにと言ってはなんですけど最終回ということで違う方法も紹介しておきます。

mylambdaexamples\MyLambdaExamples.java
// 最も一番売れた商品
System.out.println("\n<-- 最も一番売れた商品 -->");
ToIntFunction>> _toSize = (e -> e.getValue().size());
sales.collect(groupingBy(Sale::getWristwatch))
        .entrySet()
        .stream()
        .sorted(comparing(_toSize).reverseOrder())
        .map(Entry::getKey)
        .limit(1)
        .forEach(e -> {
            System.out.println(e.brand + "  " + e.model);
        });

こちらのほうが私的にはすっきりしますね。

ただ、要素が無い場合のことは考えてないですが・・・

こちらだと limit() メソッドの引数を変えるだけでベスト3とか表示させることも可能です。

まだまだ他にも方法はあるかもしれませんがはっきりいえることは Java8 はコレクションがらみが非常に強化されるってことですね!

それでは最後のお約束です。

この「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズはインターネット上で得た情報を元にそれを少し変更しているだけです。

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

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

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

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

 

Hatena タグ:

JDK8 Lambda その他いろいろ なんでもいいから動かしてみる その8

今日も「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズで GO! GO! GO! だぜぇ~

ワイルドだろぅ(もう古い)

今回は、売買価格によるソートをします。

これは今までの知識を使えば簡単に実装可能です。

ということでサラッと流しましょう。(^_^;

では、プログラムのコードは下記のよになります。

mylambdaexamples\MyLambdaExamples.java
// 売買価格によるソート
System.out.println("\n<-- 売買価格によるソート -->");
Comparator byCost = comparing((ToDoubleFunction) Sale::getCost);
sales.sorted(byCost)
        .collect(toList())
        .forEach(s -> {System.out.println((int)s.getCost() 
                + " : " + s.wristwatch.getBrand()
                + " : " + s.wristwatch.getModel()
                + "   "
                + s.seller.getFirstName() + " "
                + s.seller.getLastName()
                + " -----> "
                + s.buyer.getFirstName() + " "
                + s.buyer.getLastName());});

とてもシンプルなコードですっきりしてますね。

購入価格をソートして、それをベースに sales ストリームをソートするのに sorted() メソッドの引数に渡し、リストを collect(toList) メソッドで再構築して forEach() メソッドで表示させる。

まるで春の小川のように綺麗です。

それでは実行結果を確認します。

 

<– 売買価格によるソート –>
200000 : カルティエ : マストタンク   北川 景子 —–> 深田 恭子
250000 : カルティエ : マストタンク   綾瀬 はるか —–> 北川 景子
300000 : オメガ : ダイナミックデビル   小栗 旬 —–> 堀北 真希
300000 : ロレックス : プレシジョン   綾瀬 はるか —–> 深田 恭子
300000 : オメガ : ダイナミックデビル   綾瀬 はるか —–> 武井 咲
330000 : チュードル : カメレオン   剛力 彩芽 —–> 佐々木 希
400000 : ロレックス : プレシジョン   壇 蜜 —–> 柴田 恭平
400000 : チュードル : カメレオン   深田 恭子 —–> 綾瀬 はるか
800000 : ティファニー : ポーセリン   綾瀬 はるか —–> 深田 恭子
900000 : ティファニー : ポーセリン   武井 咲 —–> 深田 恭子
1000000 : ティファニー : ポーセリン   市原 隼人 —–> 深田 恭子

ちゃんとソートされてますね。(*^▽^*)

でも 300000 円の同じ価格のソートの順番はどうなってるん?

ちょっと気になるけど今はきにしない。(ヲヒ

それって解らないって翻訳すればいいんだろ!

たぶん、sales (LinkedHashSet) に追加された順番かな。

今日は簡単でしたね!

それではお約束事項を

この「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズはインターネット上で得た情報を元にそれを少し変更しているだけです。

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

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

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

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

 

Hatena タグ: