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

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