Java

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

Java

今日も「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズで GO! GO! GO! だぜぇ~

ワイルドだろぅ(もう古い)

今回は、売買価格によるソートをします。

これは今までの知識を使えば簡単に実装可能です。

ということでサラッと流しましょう。(^_^;

では、プログラムのコードは下記のよになります。

mylambdaexamples\MyLambdaExamples.java

とてもシンプルなコードですっきりしてますね。

購入価格をソートして、それをベースに 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

Java

今日も「JDK8 Lambda その他いろいろ なんでもいいから動かしてみる」シリーズで GO!GO! GO!です。

今回は、条件付きの一番若い買い手の年齢を調べさせます。

前に一番若い買い手を調べさせることに成功してますので特に問題はなさそうです。

今回の条件は、95万円より高価な買い物をしているとしました。

それではプログラムのコードを見てみましょう。

mylambdaexamples\MyLambdaExamples.java

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

Java

JDK8 Lambda その他いろいろ なんでもいいから動かしてみる シリーズも6回目となりました。

かなりしつこく引っ張ってます。( ̄。 ̄;)

気にせず今日は 女性同士による売買の合計金額 を計算させてみましょう。

女性の売り手と買い手をフィルタリングして売り値の合計を計算すればよさそうです。

mylambdaexamples\MyLambdaExamples.java

今回も見慣れないものが・・・

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

Java

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

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

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

mylambdaexamples\MyLambdaExamples.java

また、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 タグ:

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

Java

今日もちょこっとだけ JDK8 の新機能と戯れてみます。

昨日はロレックスの売買を全て表示させてみました。

今日は一番若い買い手を表示させてみます。

mylambdaexamples\MyLambdaExamples.java

Optional , ToIntFunction , groupingBy() , findFirst() , isPresent() など見たことのないものが出現しました。

 

Optional は JavaDoc では下記のように説明されてます。

java.​util

public final class Optional<T> extends Object

A container object which may or may not contain a non-null 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

英語なので良く解りません。(>_<。)

isPresent() メソッドと get() メソッドで操作される便利なパブリックでファイナルなクラスのようですね。(なんじゃこりゃ!)

 

ToIntFunction は JavaDoc ではどのように説明されてるのかみてみましょう。

java.​util.​function

@FunctionalInterface
public interface ToIntFunction<T>

Apply a function to the input argument, yielding an appropriate result. This is the int-bearing specialization for Function.

パラメータ:

T – the type of input objects to the function

日付:

1.8

参照:

Function

当然これも英語ですね。

@ FunctionalInterface となってます。

ToIntFunction <T>が、適切な結果をもたらして、関数を変数に適用します。

これは関数のために int を生む専門化です。

なんか解ったような解らないような・・・

残りの見慣れないものも調べてみましょう。

 

groupingBy()

java.​util.​stream.​Collectors

public static <T,K> Collector<T,Map<K,List<T>>> groupingBy(Function<? super T,? extends K> classifier)

Returns a Collector that implements a “group by” operation on input elements of type T.

Accepts a classification function from T to K. The collector produces a Map whose keys are the set of values resulting of applying the classification function to the input elements, and whose corresponding values are Lists containing the input elements which map to the associated key under the classification function.

No guarantees are made as to the type of the Map or the type of the List used for the map values.

パラメータ:

classifier – The classifier function mapping input elements to keys

型パラメータ:

T – The type of the input elements
K – The type of the keys

戻り値:

A Collector implementing the group-by operation

public static <T,K> Collector<T,Map<K,List<T>>> groupingBy(Function<? super T,? extends K> classifier)が

Tのインプット要素に関して「通り過ぎて分類する」命令を実装するコレクタをリターンするリストがTからKまで分類関数を受け入れます。

コレクタはそのキーが、分類機能をインプット要素に適用することについて、結果として生じる値である、

そしてその対応する値が分類ファンクションの下で提携させられたキーにマップするインプット要素を含んでいるリストであるマップを作成します。

保証がマップの値のために使われるタイプのマップあるいはリストのタイプについて作られません。

 

findFirst()

java.​util.​stream.​Stream

public Optional<T> findFirst()

Return an Optional describing the first element of this stream (in the encounter order), or an empty Optional if the stream is empty.

This is a short-circuiting terminal operation.

戻り値:

もしストリームが空であるなら、このストリームの第1エレメント(遭遇するオーダー)、あるいは空の Optional を記述している Optional を返してください。

これは省いているターミナル操作です。

戻り値:

Optional が、もしストリームが空なら、このストリームの第1エレメント、あるいは空の Optional を記述します

 

isPresent()

java.​util.​Optional

public boolean isPresent()

Return true if there is a value present, otherwise false.

戻り値:

true if there is a value present, otherwise false

もし値が存在するならば真を、そうでないなら偽をを返してください。

 

以上 JavaDoc を調べてみました。

私が使ってる翻訳支援ソフトでは概ねこのように翻訳されました。

Java7 から日本語の JavaDoc がなくなって非常に残念です。

Java8 で日本語の JavaDoc の復活を熱く激しくもとめます。

では、これらのことを踏まえて今回のプログラムを実行させてみます。

<– 一番若い買い手を表示 –>
武井 咲, 19歳

おおっ!何が何だか良く解らんけどちゃんと正解が表示されました。(ヲヒ

詳しくは理解できないけどプログラムのコードと JavaDoc とを照らし合せてみると何となく理解できそうです。

でも、これってフィルタリングとソートでもいけそうな気が・・・

まだまだ新機能のメリットを理解しなければ・・・

それでは次回へ続く(まだ続くのか・・・)

Hatena タグ:

« 古い記事 新しい記事 »