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 タグ:

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

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

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

 

Hatena タグ: