関数型プログラミング用の JDK1.8 関数型インターフェイス
1。概要
- 概念:
唯一の抽象メソッドを備えたインターフェイス - インターフェイスが関数型インターフェイスであるかどうかを検出する方法
@FunctionalInterfaceインターフェイスは
インターフェイス定義の上に配置されます。インターフェイスが関数型インターフェイスの場合はコンパイルに合格し、そうでない場合はコンパイルに失敗します。 - 概要:
1 つのことを行うことに重点を置いたインターフェイスである lambda に適しています。
2. よく使われるインターフェース↓↓↓
関数型インターフェイスとラムダ式の出現後、Java はいくつかの操作 (ストリーム操作をサポート) を完了するためのいくつかの単純な関数型インターフェイスを公式に提供します。これらのインターフェイスはストリーム操作で使用するため、これらの使用方法を学習してください。インターフェイスは前提条件です。これについては、後の Stream の研究でも触れます。
3.サプライヤーインターフェース
- 説明する
サプライヤー: サプライヤー
私はこれをプロバイダー インターフェイスと呼び、その機能メソッドはT get ()です。
インスタンスが構築され、インターフェイス実装で返されます。
- コード: T get()
public class Supplier_Practice {
public static void main(String[] args) {
String str = getString(() -> {
return "supplier interface";
});
System.out.println(str);
}
private static String getString(Supplier<String> stringSupplier) {
return stringSupplier.get();
}
}
4.消費者インターフェース
- 説明する
Consumer: Consumer
私はこれをユーザー インターフェイスと呼び、その機能メソッドはvoid accept (object)です。
パラメータを渡して操作し、値を返しません。
- コード: void accept (オブジェクト)
public class Consumer_Practice {
public static void main(String[] args) {
String str = "chenfeilin";
consumerString((String s) -> {
System.out.println(s.toUpperCase());
}, str);
}
private static void consumerString(Consumer<String> stringConsumer, String str) {
stringConsumer.accept(str);
}
}
- コード: andThen(Consumer<? super T> after) は、
合成された Consumer を返し、この操作を順番に実行してから、after 操作を実行します。
// 一个简单的实体类
public class Student {
private String name;
private int age;
private String address;
public Student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
public class Consumer_Practice {
public static void main(String[] args) {
Student student = new Student();
consumerTwo((Student s1) -> {
s1.setName("chenfeilin");
}, (Student s2) -> {
s2.setAddress("雷克雅未克");
s2.setAge(777);
}, student);
System.out.println(student);
}
private static void consumerTwo(Consumer<Student> stringConsumer1,
Consumer<Student> stringConsumer2, Student student) {
// 依次消费
stringConsumer1.andThen(stringConsumer2).accept(student);
}
}
コンソール出力:
学生{名前='チェンフェイリン'、年齢=777、住所='レイキャビク'}
- 注:
String 型の場合、このコンシューマーの結果は元の参照の値に反映されません。サンプルコードを見てみましょう。
public class Consumer_Practice {
public static void main(String[] args) {
String str = "chenfeilin";
consumerString((String s) -> {
s = s.toUpperCase();
System.out.println(s);
}, str);
System.out.println(str);
}
private static void consumerString(Consumer<String> stringConsumer, String str) {
stringConsumer.accept(str);
}
}
コンソール出力:
チェンフェイリン
チェンフェイリン
String str オブジェクトの値は変更されていません。
5.述語インターフェース
- 説明する
述語: アサーション
私はこれをジャッジ インターフェイスと呼び、その機能メソッドは **boolean test(Object)** です。
パラメータ値を渡して判定結果を返します。
- コード:ブール値テスト(オブジェクト)
public class Predicate_Practice {
public static void main(String[] args) {
String str = "chenfeilin";
checkString((String s) -> {
return s.length() > 3;
}, str);
}
private static void checkString(Predicate<String> stringPredicate, String str) {
boolean test = stringPredicate.test(str);
if (test) {
System.out.println("OK");
} else {
System.out.println("NG");
}
}
}
输出结果为:OK
-
補足:アサーションとして、その判定条件は&& || などの組み合わせ形式にする必要があります。
-
コード:
public class Predicate_Practice {
public static void main(String[] args) {
String str = "chenfeilin";
moreCheck((String s1) -> {
return s1.length() > 5;
}, (String s2) -> {
return s2.startsWith("ccc");
}, str);
}
private static void moreCheck(Predicate<String> stringPredicate1,
Predicate<String> stringPredicate2, String str) {
boolean test1 = stringPredicate1.and(stringPredicate2).test(str);
boolean test2 = stringPredicate1.or(stringPredicate2).test(str);
boolean test3 = stringPredicate1.negate().test(str);
System.out.println(test1);
System.out.println(test2);
System.out.println(test3);
}
}
输出结果:
false
true
false
6.機能インターフェース
- 説明する
関数: 関数
これをプロセッサ インターフェイスと呼び、その関数メソッドは **apply(Object) ** です。
パラメータを渡して(T 型)、値を返します(R 型)。
- コード: apply(オブジェクト)
public class Function_Practice {
public static void main(String[] args) {
int count = 33;
function((Integer a) -> {
return String.valueOf(a + 100);
}, count);
}
private static void function(Function<Integer, String> integerStringFunction, int a) {
String result = integerStringFunction.apply(a);
System.out.println(result);
}
}
输出结果为:133
- コード補足: andThen (Function<? super R,? extends V> after)
たとえば、Function1 の入力タイプは A、出力タイプは B、そして別の Function2 の入力パラメータ タイプは正確に B である場合、次のようになります。リンクを形成し、Function1の戻り値をFunction2の入力値として使用し、複数の「処理」を実行します
public class Function_Practice {
public static void main(String[] args) {
int count = 33;
moreFunction((Integer a) -> {
return String.valueOf(a + 100);
}, (String str) -> {
return str.length() > 2;
}, count);
}
private static void moreFunction(Function<Integer, String> function1,
Function<String, Boolean> function2, int a) {
Boolean aBoolean = function1.andThen(function2).apply(a);
System.out.println(aBoolean);
}
}