2013年 4月
Java
Java8 の注目の新機能の Lambda についてなんでもいいから情報を拾い集めて動かしてみることをしています。
今回は Predicate インターフェイスと Consumer インターフェイスです。
この情報源も英語なので詳しく読むことができませんでした。
コードよりだいたいのことを理解できればと思い、参考にさせてもらってほぼ丸写しのサンプルを作りました。(^_^;
非常にシンプルなので特に説明の必要はないと思いますが JavaDoc の内容を一部コメントとして記載しておきました。
jp\yucchi\preidcate_consumer\Person.java |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
package jp.yucchi.preidcate_consumer; import java.time.LocalDate; import java.time.Period; public class Person { public enum Sex { MALE, FEMALE } String SAN_OR_CHAN = "たん"; String firstName; String lastName; LocalDate birthday; Sex gender; public Person(String firstName, String lastName, LocalDate birthday, Sex gender) { this.firstName = firstName; this.lastName = lastName; this.birthday = birthday; this.gender = gender; } public String getFirstName() { return firstName; } public String getLastName() { return lastName + SAN_OR_CHAN ; } public Sex getGender() { return gender; } public int getAge() { return Period.between(birthday, LocalDate.now()).getYears(); } void printPerson() { System.out.println(firstName + " " + lastName + SAN_OR_CHAN + ", " + this.getAge() + "歳" + ", Gender: " + this.getGender()); } } |
jp\yucchi\preidcate_consumer\Preidcate_Consumer.java |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
package jp.yucchi.preidcate_consumer; import java.time.LocalDate; import java.util.function.Consumer; import java.util.function.Predicate; public class Preidcate_Consumer { public static void main(String[] args) { Person kyouko = new Person("深田", "恭子", LocalDate.of(1982, 11, 2), Person.Sex.FEMALE); Person saki = new Person("武井", "咲", LocalDate.of(1993, 12, 25), Person.Sex.FEMALE); System.out.println("\n<-- Person 表示 -->"); kyouko.printPerson(); saki.printPerson(); System.out.println("\n<-- アップデート後のPerson 表示 -->"); kyouko = updateInfo(kyouko, // Lambda expression for Predicate interface person -> person.getAge() > 20, // Lambda expression for Consumer inerface person -> person.SAN_OR_CHAN = "さん"); kyouko.printPerson(); saki = updateInfo(saki, // Lambda expression for Predicate interface person -> person.getAge() < 20, // Lambda expression for Consumer inerface person -> person.SAN_OR_CHAN = "ちゃん"); saki.printPerson(); } public static Person updateInfo(Person person, Predicate predicate, Consumer consumer) { // java.util.function.Predicate if (predicate.test(person)) { // Returns true if the input object matches some criteria. // java.util.function.Consumer consumer.accept(person); // Accept an input value. } return person; } } |
まず、Person インスタンスを二つ作ってその内容を表示させます。
次に Predicate インターフェイスの test() メソッドで年齢条件の判定をし、
Consumer インターフェイスの accept() メソッドで Person インスタンスのデータを操作しています。
それぞれアップデートされた内容で表示させてます。
実行結果は次のようになります。
<– Person 表示 –>
深田 恭子たん, 30歳, Gender: FEMALE
武井 咲たん, 19歳, Gender: FEMALE
<– アップデート後のPerson 表示 –>
深田 恭子さん, 30歳, Gender: FEMALE
武井 咲ちゃん, 19歳, Gender: FEMALE
”たん”から”さん”もしくは”ちゃん”に変更されてますね。(^_^)
たとえば Preidcate_Consumer.java の 29 行目が 16 歳より若い条件だったら次のようになります。
<– Person 表示 –>
深田 恭子たん, 30歳, Gender: FEMALE
武井 咲たん, 19歳, Gender: FEMALE
<– アップデート後のPerson 表示 –>
深田 恭子さん, 30歳, Gender: FEMALE
武井 咲たん, 19歳, Gender: FEMALE
Predicate インターフェイスの test() メソッドで年齢条件の判定結果が false になるので
Consumer インターフェイスの accept() メソッドが実行されないので元のまま表示されます。
それではお約です。
この「もっと Lambda 」は、インターネット上で得た情報を元にそれを少し変更しているだけです。
悲しいことにその情報源は英語なので詳しい内容はわかりません。
よって私の推測で解釈された内容となってますので間違いがあると思います。
Java8 もまだ build85 を使用していますので API の変更により記述方法が変わるかもしれません。
早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。
TAGS: Java |
2013年4月14日4:58 AM |
NetBeans
NetBeans のルック・アンド・フィールの変更がいつの間にか簡単になっていた。
なんで気付かなかったんだろう・・・
ってことで [ ツール ] → [ オプション ] でオプションウィンドウを表示させて、[ その他 ] → [ ウィンドウ ] のタブ画面で
ネィティブ・ルック・アンド・フィールの項目でお好きなものを選べます。
この Dark Nimbus なんてのは新鮮で気分転換にはいいかもしれないですね。
TAGS: NetBeans |
2013年4月13日5:59 AM |
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 |
« 古い記事
新しい記事 »