一个例子理解Java中的函数式接口

函数式接口就是只包含一个抽象方法的接口。可以这样声明:

复制代码
@FunctionalInterface
interface MultiplyNumbers {
    void multiply(int x, int y);
}

说明:

  • @FunctionalInterface 用于标记这是函数式接口,编译器会检查是否只有一个抽象方法。
  • multiply 是抽象方法,接收两个 int 参数。
  • void 表示该方法不返回值。

之后可以用 Lambda 实现它:

复制代码
MultiplyNumbers obj = (x, y) -> System.out.println(x * y);

注意接口名称要完整写成 MultiplyNumbers,不要截断;方法参数和类型也要与一致。

eg:

java 复制代码
import java.util.Scanner;

@FunctionalInterface
interface MultiplyNumbers {
    void multiply(int x,int y);
}

class Main {

    public static void main(String[] args) {
      // implement the functional interface using lambda expressions
      MultiplyNumbers obj = (x, y) -> {
        System.out.println(x * y);
      };

      Scanner input = new Scanner(System.in);
      int input1 = input.nextInt();
      int input2 = input.nextInt();
    
      obj.multiply(input1, input2);
    }
}

Q&A

Q:obj是接口名吗?

A:不是。这里:

复制代码
MultiplyNumbers obj = (x, y) -> {
    System.out.println(x * y);
};
  • MultiplyNumbers 是接口类型
  • obj 是一个变量名,表示该接口类型的对象引用
  • (x, y) -> {...} 是 Lambda 表达式,用来实现接口中的 multiply(int x, int y) 方法

可以理解为:

复制代码
MultiplyNumbers obj;
obj = (x, y) -> System.out.println(x * y);

之后通过 obj 调用接口方法:

复制代码
obj.multiply(input1, input2);

因为 MultiplyNumbers 是函数式接口,所以可以直接用 Lambda 创建它的实现。

相关推荐
ym hyd 1115 小时前
试题库管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·毕设
AC赳赳老秦5 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
钱栈up6 小时前
mvn compile 卡死在 javac 阶段:一次类型不匹配的排查与修复
java·开发语言
吠品7 小时前
CSS图片模糊过渡:一个transition加filter就够
java·数据库·notepad++
步行cgn8 小时前
Spring 全注解开发详解
java·后端·spring
长河8 小时前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
code2cat8 小时前
Java进阶篇之LongAdder:把统计更新分散,再读取总和
java·并发编程·原子类·longadder
凯哥Java8 小时前
写代码怎么避免逻辑漏洞?
java·开发语言·人工智能·自动化
Ivanqhz9 小时前
正余弦位置编码(Sinusoidal Positional Encoding)
java·linux·数据库
BD_Marathon9 小时前
消息对象中字段的说明
java·前端·python