首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >了解函数式接口FUNCTION

了解函数式接口FUNCTION

原创
作者头像
小草飞上天
发布2024-12-02 16:44:03
发布2024-12-02 16:44:03
2860
举报
文章被收录于专栏:java学习java学习

在文章开始之前,推荐一些很值得阅读的好文章!感兴趣的也可以去看一下哦!

今日推荐:深入浅出JVM(十五)之垃圾收集器

文章链接:https://cloud.tencent.com/developer/article/2472162

这篇文章主要介绍垃圾回收器的分类、性能指标以及串行与并行的垃圾收集器。对GC分类与性能指标及各种垃圾收集器都有很好的介绍,通过一些图例很好的描述了垃圾回收器相关的内容。


前言

函数式接口,即适用于函数式编程场景的接口。

在Java中的我们使用函数式编程最直观的体现就是lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口。

当然,只有在确保接口中有且仅有一个抽象方法的时候,Lambda才能顺利地进行推导程序。

什么是函数式接口?

函数式接口(Functional Interface)是Java 8及以后版本引入的一个概念,它是Java语言中的一种特殊接口。

函数式接口的定义非常简单:一个接口如果只有一个抽象方法,那么它就是一个函数式接口。

函数式接口的主要特点包括:

  1. 只包含一个抽象方法:这是函数式接口最核心的特点。针对于函数式接口有且只能有一个未实现的方法。例如,java.util.function.Predicate<T> 就是一个函数式接口,它只有一个方法 boolean test(T t)
  2. 可以包含静态方法:函数式接口可以包含静态方法。
  3. 可以包含默认方法:函数式接口可以包含默认方法。
  4. 可以包含Object类的方法:函数式接口可以覆盖Object类的方法,如equals, hashCodetoString。这些方法不计入接口的抽象方法计数。
  5. 可以用@FunctionalInterface注解标记:虽然这个注解并不是必须标记的,但使用这个注解可以更直观的帮助编译器检查一个接口是否符合函数式接口的定义同时也可以让开发人员也能更加直观的知道接口是函数式接口。
  6. 可以作为lambda表达式的类型:函数式接口的主要用途之一就是作为lambda表达式的类型。尤其是在集合的流操作中使用的相当广泛,其次如mybatis-plus中也引入了相应的lambda查询方式 。

一个简单的函数式接口定义

代码语言:txt
复制
@FunctionalInterface //注解
interface MyFunctionalInterface {
    void eat();//有且只有一个抽象方法
}

Lambda表达式与函数式接口

Lambda表达式是Java 8引入的一种表示方式,用于实例化函数式接口。

Lambda表达式的核心是使用更紧凑的方式来表达一个方法的行为,尤其是类似函数式接口这种在只有一个单一方法的情况下。

例如我们来实现上面简单函数式接口:

代码语言:txt
复制
MyFunctionalInterface fun = () -> System.out.println("我饿了,想吃饭");
fun.eat(); // 输出: 我饿了,想吃饭

这样简单的表达式就实现了对接口MyFunctionalInterface 的实现及方法的使用。

更简单的方法引用方式

方法引用是另外一种简化函数式接口实例化的方式。

方法引用允许我们直接引用一个已有的方法作为Lambda表达式。

例如:直接通过System.out::println这个已有的方法来实现接口作为表达式。

代码语言:txt
复制
MyFunctionalInterface fun = System.out::println;
fun.eat();//输出为空

使用System.out::println作为方法引用,其目的是在测试方法引用方式 ,在这里无实际意义。

JAVA中内置的函数式接口

Java 8及以后的版本在java.util.function包中引入了一系列内置的函数式接口,这些接口覆盖了常见的函数形式,使得在需要使用函数式接口时,可以直接使用这些内置接口,无需自己定义。

  • Predicate
  • Function<T, R>
  • Consumer<T>
  • Supplier<T>
  • UnaryOperator<T>
  • 等等。内置的函数式接口已经覆盖了基本的日常操作。其他如业务实际需要的可以考虑自定义一些。

下方举例使用一个函数式接口:Function<T, R>接口用于定义一个接受类型为T的对象并返回类型为R的对象的函数。它包含一个抽象方法R apply(T t)

代码语言:txt
复制
Function<String, Integer> toInteger = Integer::valueOf;
Integer result = toInteger.apply("123"); // 返回123

函数式接口在Stream API中的应用

Stream API大量使用了函数式接口,几乎所有的方法入参都有函数式接口的身影存在。例如,filter方法接受一个Predicate<T>类型的参数,map方法接受一个Function<T, R>类型的参数等。

代码语言:txt
复制
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
       .filter(n -> n == 1) // 使用Predicate接口 过滤
       .map(n -> n * n) // 使用Function接口 转换流中的数据
       .forEach(System.out::println); // 使用Consumer接口 打印

总结

函数式接口是一个强大的特性,它使得程序支持更多的函数式编程风格,同时简化并提高了代码的可读性和灵活性。

邀请人:文家齐

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 什么是函数式接口?
  • 函数式接口的主要特点包括:
  • 一个简单的函数式接口定义
  • Lambda表达式与函数式接口
  • 更简单的方法引用方式
  • JAVA中内置的函数式接口
  • 函数式接口在Stream API中的应用
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档