
什么是Java 8功能接口?
Functional Interfaces 是Java 8中引入的新概念。
这个名字本身就说明它是一个只包含抽象方法的接口。
重要的是,这个接口的实例是由lambda expressions,method references 和constructor references 创建的。
这是在Java 8中引入的函数式编程的概念。
Java 8,允许创建一个自定义的函数式接口,以及使用内置的函数式接口。
java8函数式接口的特点
- 它只包含单一的抽象方法,提出单一的功能
- 可以声明许多默认和静态方法
- 可以声明对象类的方法
- 它可以扩展非功能接口
- 它可以扩展另一个没有任何抽象方法的接口
java8 @FunctionalInterface注解示例
这是为函数式接口引入的一个新注解。
它标记了功能化编程的接口。
它可以用来在编译阶段检查代码。这个注解不是必须使用的,你仍然可以在lambda表达式中使用这些接口。
java.util.function 包包含各种内置的功能接口
自定义功能接口示例
这是一个创建我们自定义功能接口的例子。
通过注解@FunctionalInterface ,创建了MultiplyFunctionalInterface 。
它只有一个抽象的方法,没有提供实现。编写lambda表达式来实现功能接口
public class FunctionalInterfaceExample {
public static void main(String[] args) {
MultiplyFunctionalInterface mfi = (value1, value2) -> value1 * value2;
System.out.println(mfi.multiply(5, 6));
}
}
@FunctionalInterface
interface MultiplyFunctionalInterface {
public Integer multiply(Integer value1, Integer value2);
}
预定义功能接口的例子
这是一个使用现有功能接口的例子。LongBinaryOperator 是java.util.function 包中的一个功能接口。它接收两个值,并生成单一的输出。在下面的例子中使用了applyAsLong 方法。
import java.util.function.LongBinaryOperator;
public class InbuiltFunctionExamle {
public static void main(String args[]) {
LongBinaryOperator add = (value1, value2) -> value1+ value2;
System.out.println(add.applyAsLong(5, 400));
}
}
和输出:
405
功能接口的例子
我们将看到有效和无效的功能接口例子
- 有效的功能接口例子
下面的例子是一个有效的功能接口,一个方法是一个单一的抽象方法toString ,而Object类中的equals可以被重写。
@FunctionalInterface
interface MyInterface {
int method(int a, int b);
@Override
public String toString();
@Override
public boolean equals(Object obj);
}
- 无效的功能接口示例
下面的例子是无效的功能接口,在编译时抛出错误'Invalid '@FunctionalInterface' annotation; is not a functional interface' 下面的接口有两个抽象方法,只允许有一个抽象方法。
@FunctionalInterface
interface InvalidFunctionalInterface {
public Integer method(Integer value1, Integer value2);
public Integer method1(Integer value1, Integer value2);
}
这个函数式接口正在扩展另一个有抽象方法的非函数式接口。如果它上面没有抽象方法,它应该是有效的
interface NonFunctionalInterface{
void method();
}
@FunctionalInterface
interface FunctionalInterfaceHello extends NonFunctionalInterface{
void method1();
}
java.util.function包的接口和实现类
java.util.function java8中的包包含了各种预定义的功能接口。
| 接口 | 描述 |
|---|---|
| 函数 | 这指定了一般的函数,以一个参数作为输入并输出结果。 |
| 谓词 | 输出一个具有单一参数的条件表达式 |
| 消费者 | 它指定了一个操作,只接受一个参数,不输出结果。 |
| 供应者 | 它返回结果的提供者 |
| 整数供应商(IntSupplier | 用作整数结果的供应者 |
| DoubleSupplier | 用作双数结果的供应商 |
| [LongSupplier](/java8-primitive-supplier-example) | 作为Long结果的供应商使用 |
| 布尔型供应商 | 作为布尔结果的供应商使用 |
| IntConsumer | 它是一个接受整数值的消费者,不返回任何结果 |
| DoubleConsumer | 该接口接受双倍值,不返回结果 |
| LongConsumer | 代表接受长值且不返回结果的消费者 |
| UnaryOperator | 它是一个操作数,并返回相同的结果类型 |
| IntUnaryOperator | 接受整数参数并返回整数结果。 |
| DoubleUnaryOperator | 输入的是双数参数,并返回双数结果 |
| 长单数运算器(LongUnaryOperator | 取长参数作为输入,并返回长的结果 |
| ToIntBiFunction | 它接受两个整数参数作为输入,并返回整数结果。 |
| ToLongBiFunction | 它接受两个长参数作为输入并返回长的结果。 |
| ToDoubleBiFunction | 它接受两个双数参数作为输入并返回双数结果。 |
| ToIntFunction | 它接受任何数值,并返回一个唯一的整数值。 |
| ToLongFunction | 它接受任何值,只返回长的结果。 |
| IntToLongFunction | 它接受整数值,只返回长值 |
| ToDoubleFunction | 它接受任何值,只返回双倍的结果。 |
| LongToIntFunction | 它接受Long值,只返回整数值。 |
| IntToDoubleFunction | 它接受整数值,只返回双倍的结果。 |
| DoubleToLongFunction | 它接受双倍值并只返回长值 |
| LongToDoubleFunction | 它接受长值并只返回双倍值。 |
| IntFunction | 它接受整数值并返回给定值的数据类型。 |
| LongFunction | 它接受长值并返回给定值的数据类型。 |