在文章开始之前,推荐一些很值得阅读的好文章!感兴趣的也可以去看一下哦!
今日推荐:深入浅出JVM(十五)之垃圾收集器
文章链接:https://cloud.tencent.com/developer/article/2472162
这篇文章主要介绍垃圾回收器的分类、性能指标以及串行与并行的垃圾收集器。对GC分类与性能指标及各种垃圾收集器都有很好的介绍,通过一些图例很好的描述了垃圾回收器相关的内容。
函数式接口,即适用于函数式编程场景的接口。
在Java中的我们使用函数式编程最直观的体现就是lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口。
当然,只有在确保接口中有且仅有一个抽象方法的时候,Lambda才能顺利地进行推导程序。
函数式接口(Functional Interface)是Java 8及以后版本引入的一个概念,它是Java语言中的一种特殊接口。
函数式接口的定义非常简单:一个接口如果只有一个抽象方法,那么它就是一个函数式接口。
java.util.function.Predicate<T> 就是一个函数式接口,它只有一个方法 boolean test(T t)。equals, hashCode和toString。这些方法不计入接口的抽象方法计数。@FunctionalInterface //注解
interface MyFunctionalInterface {
void eat();//有且只有一个抽象方法
}Lambda表达式是Java 8引入的一种表示方式,用于实例化函数式接口。
Lambda表达式的核心是使用更紧凑的方式来表达一个方法的行为,尤其是类似函数式接口这种在只有一个单一方法的情况下。
例如我们来实现上面简单函数式接口:
MyFunctionalInterface fun = () -> System.out.println("我饿了,想吃饭");
fun.eat(); // 输出: 我饿了,想吃饭这样简单的表达式就实现了对接口MyFunctionalInterface 的实现及方法的使用。
方法引用是另外一种简化函数式接口实例化的方式。
方法引用允许我们直接引用一个已有的方法作为Lambda表达式。
例如:直接通过System.out::println这个已有的方法来实现接口作为表达式。
MyFunctionalInterface fun = System.out::println;
fun.eat();//输出为空使用System.out::println作为方法引用,其目的是在测试方法引用方式 ,在这里无实际意义。
Java 8及以后的版本在java.util.function包中引入了一系列内置的函数式接口,这些接口覆盖了常见的函数形式,使得在需要使用函数式接口时,可以直接使用这些内置接口,无需自己定义。
下方举例使用一个函数式接口:Function<T, R>接口用于定义一个接受类型为T的对象并返回类型为R的对象的函数。它包含一个抽象方法R apply(T t)。
Function<String, Integer> toInteger = Integer::valueOf;
Integer result = toInteger.apply("123"); // 返回123Stream API大量使用了函数式接口,几乎所有的方法入参都有函数式接口的身影存在。例如,filter方法接受一个Predicate<T>类型的参数,map方法接受一个Function<T, R>类型的参数等。
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 删除。