Java:関数型インターフェース

1。概要

機能インターフェイスとは、抽象メソッドが1つしかないが、複数の非抽象メソッドを持つことができるインターフェイスを指します。これを使用する目的は、Lambda式の使用をより適切にサポートし、関数型プログラミングの目標をさらに達成し、開発効率を向上させることです。

2機能インターフェイスの機能

  • 抽象メソッドは1つだけですが、メンバー、静的メソッド、デフォルトメソッドがあります。
  • アノテーション@FunctionalInterfaceを使用して、インターフェイスが関数型インターフェイスであるかどうかを確認します(抽象メソッドの数は1つです)
  • インターフェイスが機能インターフェイスの場合は、@ FunctionalInterfaceを追加するかどうかを指定できます
  • インターフェイスに複数の抽象メソッドが含まれている場合、@ FunctionalInterfaceを追加した後、エラーが報告されます

コールバック関数:簡単に言えば、メソッド(A)で渡されたパラメーターはメソッド(B)でもあり、メソッドBはメソッドAで呼び出されます。

3Lambdaを使用して関数型インターフェースを実装する

(1)インターフェースの抽象メソッドにはパラメーターがありません

最初に機能インターフェイスを定義します

/**
 * 只有一个抽象方法,符合函数式接口的规定 
 */
@FunctionalInterface
public interface FuntionInterface_ {
    
    
	public void laugh();
}

成し遂げる:

/**
 * 1.8新写法实现接口
 */
public class FunctionalInterface_03 {
    
    
	public static void main(String[] args) {
    
    
		call (() -> System.out.println("Lambda表达式实现接口")) 
	}
	public static void call(FuntionInterface_ func){
    
    
		func.laugh();
	}
}

(2)インターフェースの抽象メソッドにはパラメーターがあります

インターフェイスを定義します。

@FunctionalInterface
interface MyFunctionInter2 {
    
    
	void printMessage(String str);
}

成し遂げる:

public class FunctionalInterface{
    
    
	public static void main(String[] args) {
    
    
		String str = "有参函数式接口调用";
		// 使用 lambda 实现有参函数式接口调用
		// str 是字符串,s 是参数,str 给到 s ,打印 s
		call ( s -> System.out.println(s), str);
	}
	//定义调用接口的回调函数
	public static void call(MyFunctionInter2 func,String str) {
    
    
		func.printMessage(str);
	}
}

4JDK独自の機能インターフェイス

(1)サプライヤー:サプライヤーを表し、戻り値を持ち、データを取得でき、get()メソッドを使用してデータを取得できます。

public class JdkOwn_01 {
    
    
	public static void main(String[] args) {
    
    
	
		String result = getResult(new Supplier<String>() {
    
    
		result = getResult( ()-> "哈哈" );
		System.out.println(result);//哈哈
		
		// 创建Supplier容器
		// 此时不会调用构造方法创建对象
		Supplier<JdkOwn_01> sup = JdkOwn_01::new;
		// 创建对象并返回
		JdkOwn_01 jo1 = sup.get();
		JdkOwn_01 jo2 = sup.get();
		System.out.println(jo1);
		System.out.println(jo2);
	}

	//定义获取方法,传入供应商接口对象,由返回值
	public static String getResult(Supplier<String> function) {
    
    
		//固定写法,通过get() 获取内容
		//具体获取什么需要自己实现
		return function.get();
	}
}

(2)コンシューマー:コンシューマーインターフェイスを表します。戻り値は必要ありません。accept(T t):コンシューマー操作を実行するために使用されます。

public class JdkOwn_02 {
    
    
	public static void main(String[] args) {
    
    
		String message = "我爱花钱";
		//lambda 实现接口
		//message是参数
		//因为该消费接口是需要参数的,需要定义 x ,接受 message
		//然后打印 x
		consumeResult(x -> System.out.println(x), message);
	}
	//定义消费方法,传入消费接口对象和消费的内容
	public static void consumeResult(Consumer<String> function, String message) {
    
    
		function.accept(message);
	}
}

(3)Function <T、R>:パラメータを受け取り、結果を生成します。Tはパラメータ、Rは結果、R apply(T t)メソッドは結果を生成します。

public class JdkOwn_03 {
    
    
	public static void main(String[] args) {
    
    
		int num = convertType(x->Integer.parseInt(x), "123");
		System.out.println(num);
	}

	/**
 	 * 接受一个字符串,将其转换为数字,数字是返回值
	 * @param function  自定义接口
	 * @param str  字符串,参数
	 * @return  数字,返回值
	 */
	public static int convertType(Function<String, Integer> function, String str) {
    
    
		int num = function.apply(str);
		return num;
	}
}

(4)述語:いくつかの判断を行うために使用されるアサーションインターフェイス、booean test(T):操作を検証および比較するために使用されます。

public class JdkOwn_04 {
    
    
	public static boolean call(Predicate<String> predicate, String message) {
    
    
		return predicate.test(message);
	}
	public static void main(String[] args) {
    
    
		String message = "ok";
		boolean result = call ( x -> {
    
    return x.equals("ok");}, message);
		System.out.println(result);
	}
}

おすすめ

転載: blog.csdn.net/qq_41504815/article/details/113575368