#はじめに
関数型インタフェースの学習のために作成しました。
関数型インタフェースはインタフェースの中に関数型インタフェースの処理を事前に作成しておくことで、利用したいときに利用できるライブラリのように使用できるそうです。
そうすることで、システムやプロジェクトに捕われない汎用的なプログラムを、次のシステム開発で持ち込むことが可能になるそうです。
#手順
以下の手順で作成しました。
- インタフェースの作成
→ライガーゼロの各種装備を関数型インタフェースを用いて記述します。 - スーパークラスの作成
→素体ゼロが持っている固定装備を記述します。 - サブクラスの作成
→各種アーマーを装備したことを想定して記述します。
全て記述すると長くなるので、ライガーゼロとライガーゼロイエーガーのみを記述します。
#インタフェースの作成
各種装備の出力には、Consumer<T>を使用、
型式番号の取得には、UnaryOperator<T>を使用、
最高速度の取得には、ToDoubleFunction<T>を使用、
定員の判定には、Predicate<T>を使用しました。
AllArmedEquipment.java
package practice;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.ToDoubleFunction;
import java.util.function.UnaryOperator;
public interface AllArmedEquipment {
// 1.関数型インタフェースConsumer<T>の記述
// String型引数を取得。戻り値なし。
Consumer<String> cas = armedName -> {
if (armedName=="ライガーゼロ") {
System.out.println(armedName);
System.out.println("------------------");
System.out.println("フェアリング");
System.out.println("イオンターボブースター");
System.out.println("ダウンフォーススタビライザー");
System.out.println("AZ208mm2連装ショックカノン");
System.out.println("AZ108mmハイデンシティビームガン");
}else if(armedName=="ライガーゼロイエーガー") {
System.out.println(armedName);
System.out.println("------------------");
System.out.println("大型イオンブースター");
System.out.println("対物ブレードセンサー");
System.out.println("マルチブレードアンテナ");
System.out.println("バルカンポッド");
System.out.println("エアロフェアリング");
System.out.println("サイドスラスター");
System.out.println("フライングバルカンポッド");
}else if(armedName=="ライガーゼロシュナイダー") {
System.out.println(armedName);
System.out.println("------------------");
System.out.println("ラッシングレーザーブレード");
System.out.println("レーザーブレード");
System.out.println("Eシールドジェネレーター");
System.out.println("マルチセンサー兼スカウターポッド");
System.out.println("高出力イオンターボブースター");
System.out.println("高機動スラスター");
System.out.println("肩部高機動スラスター");
}else if(armedName=="ライガーゼロパンツァー") {
System.out.println(armedName);
System.out.println("------------------");
System.out.println("ハイブリッドキャノン");
System.out.println("AZ6連装マイクロホーミングミサイルポッド");
System.out.println("AZ3連装マイクロホーミングミサイルポッド");
System.out.println("AZ2連装マイクロホーミングミサイルポッド");
System.out.println("AZ2連装ミサイルポッド");
System.out.println("バルカンポッド");
System.out.println("AZ3連装グレネードランチャー");
System.out.println("マルチブレードアンテナ");
System.out.println("エアロフェアリング");
}
};
// 2.関数型インタフェースUnaryOperator<T>の記述。
// String型引数を取得。戻り値String型。
UnaryOperator<String> Model = armedName -> {
if (armedName=="ライガーゼロ")
return "RZ-041";
else if(armedName=="ライガーゼロイエーガー")
return "RZ-041-J";
else if(armedName=="ライガーゼロシュナイダー")
return "RZ-041-S";
else if(armedName=="ライガーゼロパンツァー")
return "RZ-041-P";
return "該当無し";
};
// 3.関数型インタフェースToDoubleFunction<T>の記述。
// String型引数を取得。戻り値double型。
ToDoubleFunction<String> maximumSpeed = armedName -> {
if (armedName=="ライガーゼロ")
return 307.0;
else if(armedName=="ライガーゼロイエーガー")
return 330.0;
else if(armedName=="ライガーゼロシュナイダー")
return 310.0;
else if(armedName=="ライガーゼロパンツァー")
return 285.0;
return 0;
};
// 4.関数型インタフェースPredicate<T>の記述。
// Integer型引数を取得。戻り値boolean型。
Predicate<Integer> Capacity = capa -> {
if(capa.equals(1))
return true;
else
return false;
};
// 「1.」で作成したConsumer<String>型のラムダ式を引数として受け取り、
// Consumer<>の抽象メソッドaccept()を実行できるようにします。
static void printConsumer(Consumer<String> cas,String name) {
cas.accept(name);
}
// 「2.」で作成したUnaryOperator<String>型のラムダ式を引数として受け取り、
// UnaryOperator<>の抽象メソッドapply()を実行できるようにします。
static void printUnaryOperator(UnaryOperator<String> Model, String name) {
System.out.println("型式番号:"+Model.apply(name));
}
// 「3.」で作成したToDoubleFunction<String>型のラムダ式を引数として受け取り、
// ToDoubleFunction<>の抽象メソッドapplyAsDouble()を実行できるようにします。
static void printToDoubleFunction(ToDoubleFunction<String> maximumSpeed, String name) {
System.out.println("時速:"+maximumSpeed.applyAsDouble(name)+"km/h");
}
// 「4.」で作成したPredicate<Integer>型のラムダ式を引数として受け取り、
// Predicate<>の抽象メソッドtest()を実行できるようにします。
static void printPredicate(Predicate<Integer> Capacity, Integer number) {
System.out.println("適正人数か:"+Capacity.test(number));
}
}
#スーパークラスの作成
ライガーゼロとライガーゼロイエーガーが共通で持っている装備を記述します。
ProtoType.java
package practice;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class ProtoType implements AllArmedEquipment{
// 素体ゼロの固定装備を記述
List<String> list = Arrays.asList("レーザーファング","ストライクレーザークロー");
Stream<String> weapons = getStream(list);
// Stream<String>型の戻値を返す
private Stream<String> getStream(List<String> list) {
Stream<String> weapon = list.stream();
return weapon;
}
// Stream<String>型の引数を受け取り、固定装備を出力
public void printStream(Stream<String> sw) {
System.out.println("固定装備:");
sw.forEach(weapon->System.out.println(weapon));
System.out.println();
}
}
#サブクラスの作成
ProtoTypeクラスを継承し、関数型インタフェースを実行できるようにします。
LigerZero.java
package practice;
public class LigerZero extends ProtoType implements AllArmedEquipment {
public static void main(String[] args) {
// 型式番号の出力
AllArmedEquipment.printUnaryOperator(Model, "ライガーゼロ");
// 素体ゼロのオブジェクト生成、固定装備の出力
ProtoType Proto = new ProtoType();
Proto.printStream(Proto.weapons);
// 装備の出力
AllArmedEquipment.printConsumer(cas, "ライガーゼロ");
// 最高速度の出力
AllArmedEquipment.printToDoubleFunction(maximumSpeed, "ライガーゼロ");
// 適正人数の判定
AllArmedEquipment.printPredicate(Capacity, 1);
}
}
ライガーゼロイエーガーも同様に。
LigerZeroJager.java
package practice;
public class LigerZeroJager extends ProtoType implements AllArmedEquipment {
public static void main(String[] args) {
// 型式番号の出力
AllArmedEquipment.printUnaryOperator(Model, "ライガーゼロイエーガー");
// 素体ゼロのオブジェクト生成、固定装備の出力
ProtoType Proto = new ProtoType();
Proto.printStream(Proto.weapons);
// 装備の出力
AllArmedEquipment.printConsumer(cas, "ライガーゼロイエーガー");
// 最高速度の出力
AllArmedEquipment.printToDoubleFunction(maximumSpeed, "ライガーゼロイエーガー");
// 適正人数の判定
AllArmedEquipment.printPredicate(Capacity, 2);
}
}
#出力結果
このように出力されました。
LigerZero.java
型式番号:RZ-041
固定装備:
レーザーファング
ストライクレーザークロー
ライガーゼロ
------------------
フェアリング
イオンターボブースター
ダウンフォーススタビライザー
AZ208mm2連装ショックカノン
AZ108mmハイデンシティビームガン
時速:307.0km/h
適正人数か:true
LigerZeroJager.java
型式番号:RZ-041-J
固定装備:
レーザーファング
ストライクレーザークロー
ライガーゼロイエーガー
------------------
大型イオンブースター
対物ブレードセンサー
マルチブレードアンテナ
バルカンポッド
エアロフェアリング
サイドスラスター
フライングバルカンポッド
時速:330.0km/h
適正人数か:false
以上となります。