2013
Java
今日もはじまります。
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 |
Java
今日も「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズで GO! GO! GO! だぜぇ~
ワイルドだろぅ(もう古い)
今回は、売買価格によるソートをします。
これは今までの知識を使えば簡単に実装可能です。
ということでサラッと流しましょう。(^_^;
では、プログラムのコードは下記のよになります。
mylambdaexamples\MyLambdaExamples.java |
98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
// 売買価格によるソート System.out.println("\n<-- 売買価格によるソート -->"); Comparator<Sale> byCost = comparing((ToDoubleFunction<Sale>) 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 の変更により記述方法が変わるかもしれません。
早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。
TAGS: Java |
2013年4月9日11:10 AM |
Java
今日も「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズで GO!GO! GO!です。
今回は、条件付きの一番若い買い手の年齢を調べさせます。
前に一番若い買い手を調べさせることに成功してますので特に問題はなさそうです。
今回の条件は、95万円より高価な買い物をしているとしました。
それではプログラムのコードを見てみましょう。
mylambdaexamples\MyLambdaExamples.java |
|
// 条件付きの一番若い買い手の年齢 System.out.println("\n<-- 条件付きの一番若い買い手の年齢 -->"); OptionalInt ageOfYoungest; ageOfYoungest = sales.filter(sale -> sale.getCost() > 950_000) .map(Sale::getBuyer) .mapToInt(Person::getAge) .sorted() .findFirst(); if (ageOfYoungest.isPresent()) { System.out.println(ageOfYoungest.getAsInt() + "歳"); } |
88 行目で OptionalInt によって年齢 ( int 値 ) を保持させる ageOfYoungest を宣言。
89 行目で条件を設定し、フィルタリングしてます。
90 行目で買い手でストリームを作り直し、
91 行目でさらに年齢 ( int ) でストリームを作り直し、
92 行目でソートして、
93 行目で最初の要素を取得、
94 行目で最初の要素があるかどうかを調べて、
95 行目で 94 行目の if 文が true なら年齢を表示表示させる。
以上のような感じかな?
さて、今回も見慣れない OptionalInt , getAsInt() メソッドが出現してきました。
JavaDoc で調べてみましょう。
OptionalInt
java.util
public final class OptionalInt extends Object
A container object which may or may not contain a int
value. If a value is present, isPresent()
will return true
and get()
will return the value.
Additional methods that depend on the presence or absence of a contained value are provided, such as orElse()
(return a default value if value not present) and ifPresent()
(execute a block of code if the value is present).
日付:
1.8
コンテナオブジェクトは int の値を持っているかもしれないし、そうでないかもしれない。
もし値が存在しているなら、isPresent () が true を返して、そして get() が値を返すでしょう。
含まれた値の有無に依存する追加のメソッドが orElse () (もし present ではないなら規定値を返してください)と ifPresent () (もし値が存在しているなら、ブロックのコードを実行してください)のように、提供されます。
いつもながら翻訳支援ソフトの翻訳では理解しにくい(;´Д`)
getAsInt()
java.util.OptionalInt
public int getAsInt()
If a value is present in this OptionalInt
, returns the value, otherwise throws NoSuchElementException
.
戻り値:
the value held by this OptionalInt
スロー:
NoSuchElementException
– if there is no value present
参照:
OptionalInt.isPresent()
もし値が OptionalInt に存在しているなら、 値を返します。そうでなければ、NoSuchElementException ntException を投げます。
ってことで OptionalInt に年齢 (int 値 ) を保持させて、getAsInt() メソッドでその値を取得するってことかな。
なんかシンプルなんだけどまどろっこしい感じもします。
でも、これを Java7 で組もうと思ったらもっと大変ですよね。
やっぱり Java8 ではかなりの革命的変革を迎えることになるんだろうか。(ちょっと大袈裟かも・・・)
あっ、気になる今回のプログラムの実行結果は次のようになります。
<– 条件付きの一番若い買い手の年齢 –>
30歳
ちゃんと期待通りの結果となります。
今回のプログラムも他の手法で組むことができますね。
Java8 ではかなりの柔軟性を持った API が用意されてるようで使いどころが悩ましいという贅沢な悩みを・・・
おっと、それを口にするほど理解を深めた訳でもないし、使いこなしているでもないな。
もっと、もっと楽しまなくては!
では、お約束事項を
この「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズはインターネット上で得た情報を元にそれを少し変更しているだけです。
悲しいことにその情報源は英語なので詳しい内容はわかりません。
よって私の推測で解釈された内容となってますので間違いがあると思います。
Java8 もまだ build83 を使用していますので API の変更により記述方法が変わるかもしれません。
早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。
TAGS: Java |
2013年4月8日5:10 AM |
Java
JDK8 Lambda その他いろいろ なんでもいいから動かしてみる シリーズも6回目となりました。
かなりしつこく引っ張ってます。( ̄。 ̄;)
気にせず今日は 女性同士による売買の合計金額 を計算させてみましょう。
女性の売り手と買い手をフィルタリングして売り値の合計を計算すればよさそうです。
mylambdaexamples\MyLambdaExamples.java |
|
// 女性同士による売買の合計金額 System.out.println("\n<-- 女性同士による売買の合計金額 -->"); double sum = sales.filter(s -> s.getBuyer().getGender() == Person.Sex.FEMALE && s.getSeller().getGender() == Person.Sex.FEMALE) .mapToDouble(Sale::getCost) .sum(); System.out.println((int) sum + "円"); |
今回も見慣れないものが・・・
mapToDouble() , sum() これらはメソッド名とコードからどういったものかだいたいの想像はつきますね。
いちおう JavaDoc をみてみましょう。
mapToDouble()
java.util.stream.Stream
public DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper)
Produce a DoubleStream
consisting of the results of applying the given function to the elements of this stream.
This is an intermediate operation.
パラメータ:
mapper
– A non-interfering, stateless function to be applied to each element
戻り値:
the new stream
どうやら ToDoubleFunction によって double 型の新しいストリームをつくるようです。(たぶん)
sum()
java.util.stream.DoubleStream
public double sum()
これって・・・
double 型の合計ってことだよね。
こんなシンプルな JavaDoc ってありなんだ。
さて、それでは気になるプログラムの実行結果をみてみましょう。
<– 女性同士による売買の合計金額 –>
3480000円
ちゃんとあってるか確認はしてないが OK としよう!
それにしても非常にシンプルで良いですね!
あっ、お約束を忘れるところでした。
でも、この「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズはインターネット上で得た情報を元にそれを少し変更しているだけです。
悲しいことにその情報源は英語なので詳しい内容はわかりません。
よって私の推測で解釈された内容となってますので間違いがあると思います。
Java8 もまだ build83 を使用していますので API の変更により記述方法が変わるかもしれません。
早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。
TAGS: Java |
2013年4月7日4:50 AM |
Java
今日もしつこく JDK8 の新機能を試してみます。
今回は最も高価な売り物を表示させてみましょう。
では昨日のプログラムを下記のように変更してみましょう。
mylambdaexamples\MyLambdaExamples.java |
|
// 最も高価な売り物 System.out.println("\n<-- 最も高価な売り物 -->"); Optional<Sale> mostCostlySale; Comparator<Sale> byCost = comparing((ToDoubleFunction<Sale>) Sale::getCost) .reverseOrder(); mostCostlySale = sales.sorted(byCost) .findFirst(); if (mostCostlySale.isPresent()) { System.out.println((int)mostCostlySale.get().getCost() + "円 " + mostCostlySale.get().wristwatch.getBrand() + " " + mostCostlySale.get().wristwatch.getModel()); } |
また、Optional , ToDoubleFunction , findFirst() が出てきましたね。
ToDoubleFunction は ToIntFunction の double バージョンのようです。
Sale クラスのインスタンスを売り値が高価な順にソートして、さらにそれを sales ストリームのソートの引数に、
そして、findFirst() メソッドによって最初に格納されている最も高価な売り物を Optional<Sale> mostCostlySale に代入。
71 行目で isPresent() メソッドで目的の最も高価な売り物の要素があるか確認して表示させてるようです。
無い場合の処理は省略してます。
昨日と今日で Optional と ToIntFunction , ToDoubleFunction , findFirst() , isPresent() の使いどころを少しだけ理解できたような気がします。
それでは気になるプログラムの実行結果は次のようになります。
<– 最も高価な売り物 –>
1000000円 ティファニー ポーセリン
期待通りの結果が得られてます。
便利ですね!
でも、この「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズはインターネット上で得た情報を元にそれを少し変更しているだけです。
悲しいことにその情報源は英語なので詳しい内容はわかりません。
よって私の推測で解釈された内容となってますので間違いがあると思います。
Java8 もまだ build83 を使用していますので API の変更により記述方法が変わるかもしれません。
早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。
TAGS: Java |
2013年4月6日6:00 AM |
« 古い記事
新しい記事 »