JDK8 Lambda その他いろいろ なんでもいいから動かしてみる その9
今日もはじまります。
JDK8 Lambda その他いろいろ なんでもいいから動かしてみる 最終回です。
やっと終わるのかと思っている人もいるかもしれませんね。
では、最終回のお題は 最も一番売れた商品 を表示させてみます。
このプログラムのコードは下記のようになります。
mylambdaexamples\MyLambdaExamples.java |
114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
// 最も一番売れた商品 System.out.println("\n<-- 最も一番売れた商品 -->"); ToIntFunction<Entry<Wristwatch, List<Sale>>> toSize = (e -> e.getValue().size()); Optional<Wristwatch> 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 |
130 131 132 133 134 135 136 137 138 139 140 141 |
// 最も一番売れた商品 System.out.println("\n<-- 最も一番売れた商品 -->"); ToIntFunction<Entry<Wristwatch, List<Sale>>> _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 の変更により記述方法が変わるかもしれません。
早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。
TAGS: Java | 2013年4月10日11:36 AM | Comment : 0