Java8 の注目の新機能の Lambda についてなんでもいいから情報を拾い集めて動かしてみることをしています。
今回は Predicate インターフェイスと Consumer インターフェイスです。
この情報源も英語なので詳しく読むことができませんでした。
コードよりだいたいのことを理解できればと思い、参考にさせてもらってほぼ丸写しのサンプルを作りました。(^_^;
非常にシンプルなので特に説明の必要はないと思いますが JavaDoc の内容を一部コメントとして記載しておきました。
| jp\yucchi\preidcate_consumer\Person.java |
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 |
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 の変更により記述方法が変わるかもしれません。
早く正式リリースされて日本語でこの超便利で素敵な新機能を勉強したい今日この頃です。