了解函数式接口FUNCTION

了解函数式接口FUNCTION

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

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

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

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

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

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

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

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

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

函数式接口的主要特点包括:只包含一个抽象方法:这是函数式接口最核心的特点。针对于函数式接口有且只能有一个未实现的方法。例如,java.util.function.Predicate 就是一个函数式接口,它只有一个方法 boolean test(T t)。可以包含静态方法:函数式接口可以包含静态方法。可以包含默认方法:函数式接口可以包含默认方法。可以包含Object类的方法:函数式接口可以覆盖Object类的方法,如equals, hashCode和toString。这些方法不计入接口的抽象方法计数。可以用@FunctionalInterface注解标记:虽然这个注解并不是必须标记的,但使用这个注解可以更直观的帮助编译器检查一个接口是否符合函数式接口的定义同时也可以让开发人员也能更加直观的知道接口是函数式接口。可以作为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包中引入了一系列内置的函数式接口,这些接口覆盖了常见的函数形式,使得在需要使用函数式接口时,可以直接使用这些内置接口,无需自己定义。

PredicateFunctionConsumerSupplierUnaryOperator等等。内置的函数式接口已经覆盖了基本的日常操作。其他如业务实际需要的可以考虑自定义一些。下方举例使用一个函数式接口:Function接口用于定义一个接受类型为T的对象并返回类型为R的对象的函数。它包含一个抽象方法R apply(T t)。

代码语言:txt复制Function toInteger = Integer::valueOf;

Integer result = toInteger.apply("123"); // 返回123

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

代码语言:txt复制List 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接口 打印

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

邀请人:文家齐

猜你喜欢

为什么天猫魔盒都下架了?天猫魔盒为什么没有电视直播?
det365娱乐场所官方网

为什么天猫魔盒都下架了?天猫魔盒为什么没有电视直播?

📅 08-13 ❤️ 917
2025年网贷平台良性退出后,借款人还需要还款吗?这几点必须了解
快影怎么剪辑视频
det365娱乐场所官方网

快影怎么剪辑视频

📅 09-04 ❤️ 249
如何设置微信聊天背景?简单步骤指南
王者荣耀克制后羿的射手有哪些_王者荣耀克制后羿的射手有哪些
为什么屁股总是凉凉的?3个生理知识,男女都该看看
约彩365彩票app下载安装

为什么屁股总是凉凉的?3个生理知识,男女都该看看

📅 07-27 ❤️ 270
一声叹息!C罗告别俄罗斯世界杯
约彩365彩票app下载安装

一声叹息!C罗告别俄罗斯世界杯

📅 08-23 ❤️ 996
2018年1月农历公历对照表:
det365娱乐场所官方网

2018年1月农历公历对照表:

📅 09-30 ❤️ 408
猫奴必败好物+1!日本热销超过50万个「猫咪蒸汽眼罩」,每日20分钟疗癒疲累双眼