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

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 の変更により記述方法が変わるかもしれません。

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

Hatena タグ:

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

今日もしつこく JDK8 の新機能を試してみます。

今回は最も高価な売り物を表示させてみましょう。

では昨日のプログラムを下記のように変更してみましょう。

mylambdaexamples\MyLambdaExamples.java
// 最も高価な売り物
System.out.println("\n<-- 最も高価な売り物 -->");
Optional mostCostlySale;
Comparator byCost = comparing((ToDoubleFunction) 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 の変更により記述方法が変わるかもしれません。

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

Hatena タグ: