详解java中的FunctionalInterface(函数式接口)

【Java 基础】-- Java 接口中的 @Public 和 @FunctionalInterface 注解详解 在 Java 开发中,@Public和注解用于标识接口的特定用途和可访问性。@Public主要用于标识某些 API 或接口对外部用户是公开的,而则用于表明该接口是一个符合 Java 8 及以上版本的函数式接口。本篇文章将详细介绍这两个注解的作用、使用场景以及最佳实践。 阅读详情

Java中的FunctionalInterface(函数式接口)是Java 8引入的核心特性之一,主要用于支持Lambda表达式和函数式编程风格。以下从定义、规则、注解、常见例子、应用场景、自定义方法及注意事项等方面进行详解:

1. 定义与核心规则

  • 定义:函数式接口是仅包含一个抽象方法的接口。Java通过@FunctionalInterface注解显式标记此类接口,编译器会强制检查是否符合规则。
  • 核心规则:
    • 接口中只能有一个抽象方法(抽象方法数量=1)。
    • 可包含多个默认方法(default methods)和静态方法(static methods)。
    • 可包含来自Object类的默认方法(如equals()、hashCode()、toString()等),这些方法不计入抽象方法计数。
    • 若接口违反规则(如多个抽象方法),即使标记@FunctionalInterface,编译器也会报错。

2. @FunctionalInterface注解

  • 作用:显式声明接口为函数式接口,编译器会验证接口是否满足函数式接口的条件。
  • 非必须:即使不添加该注解,只要接口符合函数式接口的定义,仍可作为函数式接口使用(如Lambda的目标类型)。
  • 示例:
@FunctionalInterface
public interface MyFunctionalInterface {
    void doSomething(); // 唯一抽象方法
    default void defaultMethod() { 
        System.out.println("Default method");
    }
    static void staticMethod() {
        System.out.println("Static method");
    }
}

3. 常见内置函数式接口

Java在java.util.function包中提供了大量内置函数式接口,它们为函数式编程提供了核心支持,允许将行为作为参数传递、组合或返回,覆盖常见操作:

  • Function<T, R>:
    • 定义:接受一个输入参数T,返回一个结果R。
    • 核心方法:
      • R apply(T t):执行转换操作。
      • default <V> Function<T, V> andThen(Function<? super R, ? extends V> after):链式调用,先执行当前函数,再执行after函数。
      • default <V> Function<V, R> compose(Function<? super V, ? extends T> before):链式调用,先执行before函数,再执行当前函数。
    • 用法示例:
      // 字符串转大写
      Function<String, String> toUpper = String::toUpperCase;
      System.out.println(toUpper.apply("hello")); // 输出: HELLO
      
      // 链式调用:先转大写,再截取前3个字符
      Function<String, String> truncate = str -> str.substring(0, Math.min(str.length(), 3));
      Function<String, String> pipeline = toUpper.andThen(truncate);
      System.out.println(pipeline.apply("world")); // 输出: WOR
      
    • 应用场景:
      • 数据转换(如类型转换、格式化)。
      • 流处理(Stream.map())。
      • 函数组合(构建复杂逻辑)。
  • BiFunction<T, U, R>:
    • 定义:接受两个输入参数T和U,返回一个结果R。
    • 核心方法:
      • R apply(T t, U u):执行双参数转换操作。
      • default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after):链式调用,先执行当前函数,再执行after函数。
    • 用法示例:
      // 计算两个数的和并加5
      BiFunction<Integer, Integer, Integer> addAndPlusFive = (a, b) -> a + b + 5;
      System.out.println(addAndPlusFive.apply(2, 3)); // 输出: 10
      
      // 链式调用:先求和,再转换为字符串
      BiFunction<Integer, Integer, Integer> sum = Integer::sum;
      Function<Integer, String> toString = Object::toString;
      BiFunction<Integer, Integer, String> sumToString = sum.andThen(toString);
      System.out.println(sumToString.apply(4, 5)); // 输出: "9"
      
    • 应用场景:
      • 双参数计算(如数学运算、合并数据)。
      • 复杂对象构造(如根据两个字段创建对象)。
      • 函数组合(与Function配合使用)。
  • Consumer<T>:
    • 定义:接受一个输入参数T,不返回结果(执行副作用操作)。
    • 核心方法:
      • void accept(T t):执行操作。
      • default Consumer<T> andThen(Consumer<? super T> after):链式调用,先执行当前操作,再执行after操作。
    • 用法示例:
      // 打印字符串
      Consumer<String> printer = System.out::println;
      printer.accept("Hello"); // 输出: Hello
      
      // 链式调用:先打印,再记录日志
      Consumer<String> logger = str -> System.out.println("Log: " + str);
      Consumer<String> combined = printer.andThen(logger);
      combined.accept("World"); // 输出: World \n Log: World
      
    • 应用场景:
      • 遍历集合(Stream.forEach())。
      • 日志记录。
      • 资源操作(如关闭文件、释放锁)。
  • BiConsumer<T, U>:
    • 定义:接受两个输入参数T和U,不返回结果(执行副作用操作)。
    • 核心方法:
      • void accept(T t, U u):执行双参数操作。
      • default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after):链式调用,先执行当前操作,再执行after操作。
    • 用法示例:
      // 打印两个数的和
      BiConsumer<Integer, Integer> printSum = (a, b) -> System.out.println(a + b);
      printSum.accept(2, 3); // 输出: 5
      
      // 链式调用:先打印和,再打印积
      BiConsumer<Integer, Integer> printProduct = (a, b) -> System.out.println(a * b);
      BiConsumer<Integer, Integer> combined = printSum.andThen(printProduct);
      combined.accept(4, 5); // 输出: 9 \n 20
      
    • 应用场景:
      • 双参数操作(如更新对象属性、记录日志)。
      • 事件处理(如GUI中的按钮点击事件)。
  • Supplier<T>:
    • 定义:不接受输入参数,返回一个结果T(延迟计算或生成值)。
    • 核心方法:
      • T get():生成并返回结果。
    • 用法示例:
      // 生成随机数
      Supplier<Double> randomSupplier = Math::random;
      System.out.println(randomSupplier.get()); // 输出: 0.xxx
      
      // 延迟初始化
      Supplier<List<String>> listSupplier = ArrayList::new;
      List<String> list = listSupplier.get(); // 仅在需要时创建对象
      
    • 应用场景:
      • 延迟计算(如按需加载资源)。
      • 生成默认值(如Optional.orElseGet())。
      • 工厂模式(创建对象)。
  • Predicate<T>:
    • 定义:接受一个输入参数T,返回一个布尔值。

    • 核心方法:

      • boolean test(T t):执行判断操作,返回true或false。
      • default Predicate<T> and(Predicate<? super T> other):逻辑与组合,返回一个新的Predicate,只有当当前Predicate和other都返回true时,新Predicate才返回true。
      • default Predicate<T> or(Predicate<? super T> other):逻辑或组合,返回一个新的Predicate,只要当前Predicate或other中有一个返回true,新Predicate就返回true。
      • default Predicate<T> negate():逻辑非操作,返回一个新的Predicate,其判断结果与当前Predicate相反。
    • 用法示例:

      // 判断字符串是否为空
      Predicate<String> isNotEmpty = str -> str != null && !str.isEmpty();
      System.out.println(isNotEmpty.test("Hello")); // 输出: true
      System.out.println(isNotEmpty.test("")); // 输出: false
      
      // 组合多个Predicate
      Predicate<String> isLongerThan5 = str -> str.length() > 5;
      Predicate<String> combinedPredicate = isNotEmpty.and(isLongerThan5);
      System.out.println(combinedPredicate.test("Hello World")); // 输出: true
      System.out.println(combinedPredicate.test("Hi")); // 输出: false
      
    • 应用场景:

      • 过滤集合元素(如Stream.filter())。
      • 条件判断(如if语句中的条件)。
  • BiPredicate<T, U>:
    • 定义:接受两个输入参数T和U,返回一个布尔值。

    • 核心方法:

      • boolean test(T t, U u):执行双参数判断操作,返回true或false。
      • 类似Predicate,也提供了and、or和negate方法用于逻辑组合。
    • 用法示例:

      // 判断两个整数是否相等
      BiPredicate<Integer, Integer> isEqual = (a, b) -> a.equals(b);
      System.out.println(isEqual.test(1, 1)); // 输出: true
      System.out.println(isEqual.test(1, 2)); // 输出: false
      
    • 应用场景:

      • 双参数条件判断(如比较两个对象是否相等)。
  • UnaryOperator<T>:
    • 定义:继承自Function<T, T>,接受一个输入参数T,返回同类型的输出T。

    • 核心方法:

      • T apply(T t):执行转换操作,输入和输出类型相同。
    • 用法示例:

      // 字符串转大写
      UnaryOperator<String> toUpper = String::toUpperCase;
      System.out.println(toUpper.apply("hello")); // 输出: HELLO
      
    • 应用场景:

      • 类型转换(输入和输出类型相同)。
      • 对象方法调用(如调用对象的某个方法并返回自身)。
  • BinaryOperator<T>:
    • 定义:继承自BiFunction<T, T, T>,接受两个同类型的输入参数T,返回同类型的输出T。

    • 核心方法:

      • T apply(T t1, T t2):执行双参数转换操作,输入和输出类型相同。
    • 用法示例:

      // 计算两个整数的和
      BinaryOperator<Integer> sum = Integer::sum;
      System.out.println(sum.apply(2, 3)); // 输出: 5
      
    • 应用场景:

      • 双参数计算(输入和输出类型相同)。
      • 合并两个对象(如合并两个集合)。

java.util.function包还提供了一系列针对基本数据类型(如int、long、double)的特化接口,如IntFunction、LongFunction、DoubleFunction、IntConsumer、LongConsumer、DoubleConsumer等。这些接口减少了自动装箱和拆箱的开销,提高了性能。

示例:

// IntFunction示例:接受一个int参数,返回一个String
IntFunction<String> intToString = Object::toString;
System.out.println(intToString.apply(123)); // 输出: "123"

// DoubleConsumer示例:接受一个double参数,不返回结果
DoubleConsumer printDouble = System.out::println;
printDouble.accept(3.14); // 输出: 3.14

4. 与Lambda表达式的关联

  • Lambda表达式是函数式接口的实例,用于实现其唯一抽象方法。
  • 语法:(参数) -> 表达式 或 (参数) -> { 代码块 }。
  • 示例:
// 使用Function接口
Function<Integer, String> intToString = num -> "Number: " + num;
System.out.println(intToString.apply(42)); // 输出:Number: 42

// 使用Predicate接口
Predicate<String> isEmpty = str -> str == null || str.isEmpty();
System.out.println(isEmpty.test("")); // 输出:true

5. 自定义函数式接口

  • 步骤:定义接口,确保只有一个抽象方法,可选添加@FunctionalInterface注解。
  • 示例:
@FunctionalInterface
public interface CustomCalculator {
    int calculate(int a, int b); // 唯一抽象方法
}

// 使用Lambda
CustomCalculator adder = (a, b) -> a + b;
System.out.println(adder.calculate(5, 3)); // 输出:8

6. 应用场景

  • Stream API:map()、filter()、reduce()等方法接受函数式接口作为参数。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
     .filter(name -> name.length() > 3) // Predicate
     .map(name -> name.toUpperCase())   // Function
     .forEach(System.out::println);     // Consumer
  • 并发编程:CompletableFuture、并行流(parallelStream())中使用函数式接口处理异步任务。
  • 事件监听:GUI编程中事件处理(如按钮点击)。
  • 依赖注入:Spring框架中的@FunctionalInterface用于定义函数式Bean(如Function<Request, Response>)。

7. 注意事项与限制

  • 抽象方法唯一性:若接口有多个抽象方法,无法作为函数式接口使用。
  • 类型推断:Lambda的参数类型可省略,由编译器推断。
  • 作用域:Lambda可访问外部变量(需为final或等效final)。
  • 异常处理:函数式接口的抽象方法可声明抛出异常,但需与Lambda体中的异常兼容。
  • 性能:Lambda表达式在运行时可能生成内部类实例,但JIT编译器会优化热代码路径。
  • 与匿名内部类对比:Lambda更简洁,但匿名内部类可访问局部变量的final变量(Lambda仅需等效final)。

8. 高级用法

  • 方法引用:简化Lambda表达式,直接引用现有方法(如System.out::println)。
  • 组合函数:通过and()、or()、negate()等默认方法组合Predicate实例。
  • 自定义函数式接口的扩展:结合默认方法提供额外功能(如缓存、日志)。

总结

函数式接口是Java支持函数式编程的基石,通过Lambda表达式实现代码的简洁性和可读性。它们在标准库(如Stream API)、并发编程和框架中广泛应用。自定义函数式接口需严格遵守抽象方法唯一性规则,并合理利用默认方法和静态方法增强功能。理解函数式接口的规则和应用场景,有助于编写更高效、更现代的Java代码。

FunctionalInterface注解详解 摘要: @FunctionalInterface是Java中用于标记函数式接口的注解,要求接口只能包含一个抽象方法(可包含多个static或default方法)。它支持通过lambda表达式简化实现,例如TestInterface test = () -> System.out.println("test");。该注解常用于定义回调、事件处理器等场景,允许通过参数自动匹配lambda表达式,并支持无参/有参构造。示例展示了传统匿名类与lambda两种实现方式,以及如何在序列化等场景 阅读详情

相关推荐

函数式接口与 @FunctionalInterface 注解:函数式编程在 Java 中的实现!

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。  在 Java 8 中,函数式接口 是一个非常重要的概念,它使得 Java 能够支持函数式编程风格。函数式接口是一个只包含 一个抽象方

喵手的博客 1240

@FunctionalInterface

什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。 这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。 函数式接口用途 它们主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。 如定义了...

ArvinWoo 2万+

微信小程序利用Echarts加载中国地图的步骤

微信小程序如何利用Echarts加载地图?可按照如下四个步骤进行。(阅读时间大概3分钟)。

成都都成 5275

Java中@FunctionalInterface注解详解

Java中@FunctionalInterface注解详解

向上的"狼"的博客 5635

多任务学习中的过拟合陷阱:动态停止训练机制详解与避坑指南

本文深入剖析了多任务学习中因任务过拟合不同步导致的性能下降问题,并详细介绍了动态停止-继续训练机制。该机制通过为每个任务设置独立的训练开关,基于验证集性能动态控制其梯度更新,有效缓解了任务间负迁移,是提升多任务模型整体泛化能力的关键策略。

happy2的博客 1092

MIT IDSS深度解析:跨学科融合与系统科学实践

麻省理工学院的IDSS(Institute for Data, Systems, and Society, IDSS)是一个致力于通过先进分析方法推动教育与研究的前沿机构。它将工程学、信息科学和数据科学的方法与社会科学的分析方法相结合,以应对复杂的社会挑战。

AllenLV的博客 2086

Java特性函数式接口注解@FunctionalInterface浅析

一个函数式接口是只有一个抽象方法(不包括继承自java.lang.Object的默认方法)的特定接口。这个抽象方法可以有任意数量的默认方法、静态方法以及覆盖Object类的方法。关键在于该接口必须确保只有一个未被实现的抽象方法。在 Java 中,函数式接口是专门为了配合 lambda 表达式和方法引用而设计的接口。单一抽象方法:函数式接口的核心特征是它只包含一个抽象方法。这意味着除了默认方法、静态方法或继承自的方法之外,它不能有其他的抽象方法。默认方法。

沛哥儿的专栏 5859

【JTAG】1500协议详解

随着集成电路的规模不断扩大,1149.1的板级测试无法满足要求越来越高的芯片测试需求。芯片规模变大后,测试需求不在是一次测试整片芯片,而是芯片分为好几个区域去测试,而1500协议正是对1149.1在该方面的一个补充即1149.1主要测试板级间的互连,而1500用来测试芯片内不同core之间的互连。IEEEStd1500已经为包含不同模块的集成电路(ICs)开发了一种可测试性设计标准方法。............

xuhe0206的博客 7022

Java8新特性之 函数式接口FunctionalInterface详解

Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版。本文将java8的一个新特性 函数式接口 单独深度剖析。函数式接口的范例:@FunctionalInterface是JDK 8 中新增的注解类型,用来描述一个接口是函数式接口。例如我们熟悉的Runnable 接口:@FunctionalInterface public interface Runnable {

道哥的技术博客 4171

HBase批量导入工具:BulkLoad使用详解

HBase作为分布式NoSQL数据库,在大数据领域有着广泛应用。传统的数据写入方式(如Put操作)在面对海量数据导入时存在性能瓶颈。BulkLoad提供了一种高效的大批量数据导入方案,可以显著提高数据加载速度并降低集群负载。BulkLoad的核心原理和架构与传统写入方式的性能对比详细的使用方法和实现步骤性能优化技巧和最佳实践实际应用案例分析本文首先介绍BulkLoad的基本概念和原理,然后深入讲解其实现机制和关键技术。接着通过实际案例演示BulkLoad的使用方法,并分析性能优化策略。

大数据洞察的博客 1236

我的GIT练习ONE

Git 是一个分布式版本控制及源代码管理工具;Git 可以为你的项目保存若干快照,以此来对整个项目进行版本管理每一次的练习,都是对自身知识的巩固,以及对自身知识的一个测试。

是个非常热爱生活、乐观、奋斗、努力的逗比青年 8869

FunctionalInterface注解

FunctionalInterface 是一个信息性注解类型,用于指示接口类型符合 Java 语言规范定义的函数式接口要求。 从概念上讲,函数式接口只有一个抽象方法,其他方法都有默认的实现。 如果接口声明了一个覆盖 java.lang.Object 的公共方法之一的抽象方法,这也不会进入抽象方法计数,因为接口的任何实现都具有来自 java.lang.Object 或其他地方的实现。 请注意,函数式接口的实例可以使用 lambda 表达式、方法引用或构造函数引用来创建。 如果使用此注解类型对类型进行注

qinghuazs的博客 4038

微信小程序 - 实现大文件上传分片/切片+本地选择文件上传超大文件,小程序大文件切片上传+断点续传+上传进度条+失败自动重传完整运行示例源码,支持图片、视频、文档各种文件(支持上传单个文件或批量上传)

微信小程序实现大文件上传,实现分片大文件上传,微信小程序 分片 断点续传 大文件上传,微信小程序实现大文件上传 分片上传 进度条,小程序文件分片上传,微信小程序如何上传很大的文件,在选择文件后,按指定大小将文件切割成独立的文件片,并逐片上传,uniapp 微信小程序上传大文件如何切片,微信小程序实现大文件分片上传、断点续传、秒传,解决大文件上传问题,大文件上传如何做断点续传,微信小程序wx.uploadFile,小程序上传视频,小程序上传文档,实现大文件上传(切片上传)实现大文件上传到服务器教程,支持批量多

🏆 前端领域优质创作者 1万+

JAVA8特性之函数式接口-@FunctionalInterface注解

JAVA8的新特性函数式接口的介绍和使用

不是很懂 2万+

[QMT量化交易小白入门]-十二、QMT回测龙头打首板和连板的策略

class a():passA = a() #创建空的类的实例 用来保存委托状态field_list定义了需要的市场数据字段,而类a用于保存交易状态。

木头大左的博客 4759

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java 8 函数式接口讲解(@FunctionalInterface, Lambda)

Java 8 函数式接口讲解(@FunctionalInterface, Lambda) 什么是函数式接口(Functional Interface) 其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,只能有一个抽象方法的接口(interface)称之为函数式接口 这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。 函数式接口用途 它们主要用在Lambda表达式和方法引用(实际上也...

我是guyue,guyue就是我O(∩_∩)O 852

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java之函数式接口(FunctionalInterface)

Java之函数式接口 FunctionalInterface

我的博客 5436

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

函数式接口FunctionalInterface

1.1 函数式接口: 有且只有一个抽象方法的接口,称之为函数式接口 当然接口中可以包含其他的方法(默认,静态,私有) 1.2 @FunctionalInterface 作用:可以检测接口是否是一个函数式接口 是:编译成功 否:编译失败(接口中没有抽象方法,抽象方法的个数多于一个) 1.3 自定义函数式接口MyFunctionalInterface package com.FunctionalInterface; /* 函数式接口:有且只有一个抽象方法的接口,称之为函数式接口 当然接口

weiyoo55的博客 7928

Java8之函数式接口及常用函数式接口

函数式接口、Supplier、Consumer、Predicate、Function等

代码大师麦克拉瑞的博客 6714

函数式接口 FunctionalInterface

函数式接口是在 Java 8 中引入的概念,用于支持 Lambda 表达式和方法引用。在 Java 中,函数式接口本质就是一个锚点,无论是Lambda 还是 方法引用 都要挂载到这个锚点上才有意义。由于函数式接口可以用 Lambda 表达式或方法引用实现,开发者不需要编写大量的匿名类实现,从而减少样板代码,简化开发。Lambda 表达式往往是一次性使用的,很难像普通方法那样进行复用。在需要复杂或可复用的逻辑时,可能还是需要编写常规方法或类。

2301_78976656的博客 862

FunctionalInterface函数式接口

什么是函数式接口 所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。 这种类型的接口也称为SAM接口,即Single Abstract Method interfaces 特点 接口有且仅有一个抽象方法 允许定义静态方法 允许定义默认方法 允许java.lang.Object中的public方法 该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInter

chc2327439008的博客 250

Java中的函数式编程(二)函数式接口Functional Interface

写在前面 前面说过,判断一门语言是否支持函数式编程,一个重要的判断标准就是:它是否将函数看做是“第一等公民(first-class citizens)”。 函数是“第一等公民”,意味着函数和其它数据类型具备同等的地位——可以赋值给某个变量,可以作为另一个函数的参数,也可以作为另一个函数的返回值。 Java 8是通过函数式接口,赋予了函数“第一等公民”的特性。 本文将详细介绍Java 8中的函数式接口。 本文的示例代码可从gitee上获取: https://gitee.com/cnmemset/

anyuanwai的博客 4717

Java8函数式接口编程【lambda表达式、FunctionalInterface注解、Supplier、Consumer、Predicate、Function函数式接口】

1、函数式接口的定义2、FunctionalInterface注解3、函数式接口的使用4、lambda延迟执行特性5、Supplier函数式接口6、Consumer函数式接口7、Predicate函数式接口8、Function函数式接口 1、函数式接口的定义 有且仅有一个抽象方法的接口 函数式接口顾名思义就是函数式编程的接口,在Java中最能体现函数式编程的无非就是Lambda,所以函数式接口是可以适用于Lambda使用的接口; 只有确保只有一个抽象方法,Lambda才能顺利地推导 2、Funct.

Kevinnsm的博客 517

JDK8函数式接口@FunctionalInterface的使用详解

020博客地址汇总 2019年博客汇总 转载:https://blog.youkuaiyun.com/ZYC88888/article/details/86649994 我们常用的一些接口Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface注解。 通过JDK8源码javadoc,可以知道这个注解有以下特点: 1、该注解只能标记在”有且仅有一个抽象方法”的接口上。 2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。 3、接口默认继.

架构师的成长之路的博客 9817
上一篇: 谷歌开源翻译模型 TranslateGemma 深度解析与本地部署实践
下一篇: 详解JUC包中的Condition接口
Jack_abu
博客等级 码龄10年 633粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack_abu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值