欢迎访问宙启技术站
智能推送

Java函数式接口与函数引用

发布时间:2023-06-22 11:51:19

Java作为一门对象化编程语言,对象与方法是Java中最基本的概念。面向对象编程 paradigm 通常将功能抽象为一个类,然后给出对应的方法。随着时间的推移,代码越来越复杂,抽象层次越来越高,我们发现,大部分方法都是只有一个方法,然而我们需要的是直接相应这个功能的方法,那么这个 的方法有必要存在于一个因特殊化的类中吗?Java提倡面向对象编程 paradigm,但是由于Lambda 表达式的引入,Java也逐渐使用了函数接口和函数引用两个概念。

函数式接口概念

Java中函数接口指的是一个拥有 一个抽象方法的接口。函数接口可以包含多个其他非抽象方法(默认方法和静态方法)。例如,Runnable是一个函数接口,因为它只有一个名为run的方法,该方法不接受任何参数并返回任何值。函数接口可以用作相应类型的变量,这意味着我们可以将这样的对象赋值给变量并调用它的 方法。

即使我们不显式地声明一个接口为函数型接口,也可以将它视为函数型接口,但当我们给这个接口添加多于一个的抽象方法,编译器会发出关于抽象方法多余一个的警告。

Java 8中内置了许多常用的函数式接口。常见的函数接口包括:

1. Consumer<T> : 代表了接受一个输入参数并且无返回的操作(可以使用Lambda进行替换)

2. Supplier<T> : 代表了一个供应商,不接受任何参数该接口的实现应该返回一个特定类型的对象

3. Function<T, R> :代表了接受一个输入类型T的对象,并返回一个R类型的结果(可以使用Lambda进行替换)

4. Predicate<T> : 特定接受者的布尔型功能。接受一个T类型的对象,并返回一个布尔值。Predicate接口包含多种默认方法来组合Predicate。这些方法称为 一种方法。它们分别是: and(),or()和negate()。

函数式接口的作用:

函数式编程是强调函数的处理能力,在方法切分的同时,还需要考虑将方法作为参数进行传递。该功能对于Lambda表达式尤其有用。从设计思想的角度来看,Lambda表达式的注重点不在类以及状态上,而是在您可以传递及执行的一小段代码上。Lambda表达式将带来多种优势:线程安全,可读性,习惯性,调用的基本执行策略,等等。

函数引用概念

Java引入了Lambda表达式来提高代码的可读性和可维护性,但是有些时候可以通过一个Java中另一个工具来执行Lambda表达式的v功能,那就是函数引用。

函数引用是Lambda表达式的由来。Lambda表达式的语法繁琐,特别是在接口有很多默认方法之后。每一个Lambda表达式都有一个方法,这个方法可以使用函数引用方式调用。

函数引用本质上是将Lambda表达式引用到一个方法上。函数引用提供了一种直接访问方法或构造函数的强大而简单的方式。

函数引用的类型:

1. 静态方法引用 

2. 对象方法引用 :在 Lambda 表达式实现中,如果我们需要调用某一实体类的普通方法,那么我们就可以使用这种引用类型。

3. 构造器引用 :与静态方法引用类似,只是将方法名变成了 new。

4. 数组构造器引用

例如,我们可以在Java中使用函数引用以下方法:

1. 数据代替 ArrayList::new: 这里我们可以引用一个数组构造器通过引用,将其绑定到某个构造函数并实例化一个对象。 

2. Thread.currentThread()也可以通过以下方式获得引用: Thread.currentThread。 

3. 我们可以使用方法引用System.out::println作为Consumer<String>。 

4. 参数与结果的Lambda表达式p->p.toLowerCase()只是它的对应方法String.toLowerCase。 

Java程序员必须熟悉lambda和函数引用,因为这两个最常用的概念相互补充。

总结

现代编程越来越依赖面向对象,但同时函数式编程因为其灵活性也越来越受欢迎。函数式编程和面向对象编程之间的主要区别在于函数式编程更加集中于代码的计算,而面向对象编程更加强调组织和管理代码。Java 8中的函数式接口在不熟悉函数式编程的Java工程师当中得到了广泛的认可,Lambda表达式使得代码更加易读、可维护和高效。而更进一步,Java 8引入的函数引用增加了Lambda表达式的可读性和可靠性。理解和掌握合适的Java API非常重要,而熟练掌握Lambda表达式和函数引用则是更高效编写代码的重要技巧。