【浅理自悟】之 - @FunctionalInterface

@FunctionalInterface

1、它的定义有要求

要求:有且仅有一个抽象方法。

2、它有什么用,作用就是耍酷 ?

@FunctionalInterface是什么?不要想太多,它就是一个接口。只不过是一个支持Lambda的函数接口罢了。

public class FunInterfaceTest {
    public static void main(String[] args) {

		/////// 无参数的写法 BEGIN ////////////
		public static void test(FunInterface funInterface){
        	funInterface.say();
    	}
		// 新款(Lambda)耍酷的写法
        FunInterfaceTest.test(() -> {
            System.out.println("lambda");
        });

		// 老款接口的写法
        FunInterfaceTest.test(new FunInterface() {
            @Override
            public void say() {
                System.out.println("new obj");
            }
        });

		// 利用@FunctionalInterface 注解(无参)
    	@FunctionalInterface
    	public interface FunInterface {
        	void say();
    	}

}



public class FunInterfaceTest2 {
    public static void main(String[] args) {
		/////// 有参数的写法 BEGIN ////////////
		public static void test2(FunInterface2 funInterface){
        	funInterface.say("跑跑");
    	}
 
       FunInterfaceTest.test2(msg -> {
            System.out.println("lambda Fun2 "+msg);
            return "lambda Fun2 "+msg;
       });

       FunInterfaceTest.test2(new FunInterface2() {
            @Override
            public String say(String msg) {
                System.out.println("new Obj Fun2 "+ msg);
                return "new Obj Fun2 "+ msg;
            }
       });   
     }
     
    // 利用@FunctionalInterface 注解(有参)
    @FunctionalInterface
    public interface FunInterface2 {
        String say(String msg);
    }
}

3、自悟中…

<think>根据给定的引用内容,用户询问的是@FunctionalInterface注解的使用方法。我将从引用中提取相关信息,并按照系统指令要求组织回答。 关键信息提取: - 引用[1]:@FunctionalInterface用于表明接口是函数式接口(符合Java 8+) - 引用[3]:被注解标记的接口必须有且仅有一个抽象方法(覆盖Object类方法不计入) - 引用[4]:函数式接口本质是只有一个抽象方法的接口,关注方法签名而非实现 回答结构: 1. 注解作用:明确说明@FunctionalInterface的核心用途 2. 使用条件:详细说明满足函数式接口的条件 3. 使用方法:给出具体代码示例 4. 注意事项:补充关键使用细节 代码示例将包含: - 正确声明函数式接口 - 使用lambda表达式实现接口 - 错误用法示例(如多个抽象方法) 最后生成相关问题 </think>### @FunctionalInterface注解的使用方法 `@FunctionalInterface` 是 Java 8 引入的注解,用于**标识函数式接口**。函数式接口是指**仅包含一个抽象方法**的接口(覆盖 `Object` 类的方法不计入抽象方法计数)。以下是具体使用方法: --- #### 1. **基本语法** ```java @FunctionalInterface public interface MyFunction { // 唯一的抽象方法 void execute(String input); } ``` - 必须满足条件:**仅有一个抽象方法**(非默认/静态方法)。 - 若违反此条件(如声明多个抽象方法),编译器会报错: ```java @FunctionalInterface public interface InvalidFunction { void method1(); // 抽象方法1 void method2(); // 抽象方法2 → 编译错误! } ``` --- #### 2. **覆盖 `Object` 类的方法不计数** 若接口包含覆盖 `Object` 类的方法(如 `toString()`),它不计入抽象方法数量: ```java @FunctionalInterface public interface Converter { String convert(int num); // 唯一的抽象方法 // 覆盖Object类的方法 → 合法 @Override String toString(); } ``` --- #### 3. **与Lambda表达式结合使用** 函数式接口的核心价值是支持 **Lambda表达式** 或 **方法引用**: ```java // 定义函数式接口 @FunctionalInterface interface MathOperation { int calculate(int a, int b); } public class Main { public static void main(String[] args) { // Lambda实现接口 MathOperation add = (a, b) -> a + b; System.out.println(add.calculate(3, 5)); // 输出8 } } ``` --- #### 4. **常见应用场景** - **简化代码**:替代匿名内部类。 ```java Runnable task = () -> System.out.println("Running"); ``` - **Stream API**:与 `map()`, `filter()` 等方法结合。 ```java List<Integer> numbers = Arrays.asList(1, 2, 3); numbers.stream().filter(n -> n % 2 == 0).forEach(System.out::println); ``` --- #### 5. **注意事项** - **非强制使用**:即使不添加 `@FunctionalInterface`,满足条件的接口仍是函数式接口。但添加注解可确保编译器检查抽象方法数量[^3]。 - **兼容性**:若接口继承其他接口,需确保合并后仍只有一个抽象方法: ```java interface Parent { void parentMethod(); } @FunctionalInterface interface Child extends Parent { // 错误:包含Parent的parentMethod → 共两个抽象方法! } ``` --- ### 相关问题 1. `@FunctionalInterface` 注解在 Java 8 的 Stream API 中如何应用? 2. 如何处函数式接口与默认方法的冲突? 3. `@FunctionalInterface` 和 Java 的 `@Override` 注解有何设计差异? [^1]: 【Java 基础】-- Java 接口中的 @Public 和 @FunctionalInterface 注解详解 [^3]: java8 functionalinterface注解_@FunctionalInterface注解的使用 [^4]: @FunctionalInterface注解分析及使用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值