Java中Functional Interface的分类和使用详解
在Java 8中,添加了对函数式编程的支持,也就引入了Functional Interface。Functional Interface是指只包含一个抽象方法的接口,它可以被转换为lambda表达式。在本文中,我们将详细介绍Functional Interface的分类和使用方式。
Functional Interface的分类
Supplier
Supplier是一个不接受任何参数但返回一个值的函数式接口,它的内置函数式接口是java.util.function.Supplier
。该接口只有一个方法get()
,用于获取一个结果。以下是一个获取当前时间的例子:
Supplier<LocalDateTime> localDateTimeSupplier = LocalDateTime::now;
LocalDateTime localDateTime = localDateTimeSupplier.get();
Consumer
Consumer是一个接受一个参数但没有返回值的函数式接口,它的内置函数式接口是java.util.function.Consumer
。该接口只有一个方法accept(T t)
,用于处理输入参数。以下是一个输出字符串的例子:
Consumer<String> stringConsumer = System.out::println;
stringConsumer.accept("Hello, World!");
Function
Function是一个接受一个参数并返回一个结果的函数式接口,它的内置函数式接口是java.util.function.Function
。它包含两个参数T
和R
,分别表示输入和输出类型。该接口只有一个方法apply(T t)
,用于处理输入参数并返回结果。以下是一个将字符串转换为整数的例子:
Function<String, Integer> stringToIntegerFunction = Integer::parseInt;
Integer i = stringToIntegerFunction.apply("123");
Predicate
Predicate是一个接受一个参数并返回一个布尔值的函数式接口,它的内置函数式接口是java.util.function.Predicate
。该接口只有一个方法test(T t)
,用于处理输入参数并返回结果。以下是一个判断字符串是否为空串的例子:
Predicate<String> stringPredicate = String::isEmpty;
boolean isEmpty = stringPredicate.test("");
UnaryOperator
UnaryOperator是一个接受一个参数并返回与该参数类型相同的结果的函数式接口,它的内置函数式接口是java.util.function.UnaryOperator
。它扩展了Function接口,该接口只有一个方法apply(T t)
,用于处理输入参数并返回结果。以下是一个对整数进行绝对值计算的例子:
UnaryOperator<Integer> abs = Math::abs;
int i = abs.apply(-123);
BinaryOperator
BinaryOperator是一个接受两个参数并返回与该参数类型相同的结果的函数式接口,它的内置函数式接口是java.util.function.BinaryOperator
。它扩展了BiFunction接口,该接口只有一个方法apply(T t, U u)
,用于处理输入参数并返回结果。以下是一个对两个整数进行求和的例子:
BinaryOperator<Integer> sum = Integer::sum;
int result = sum.apply(1, 2);
Functional Interface的使用
除了使用Java内置的函数式接口,我们还可以自定义Functional Interface。在定义自己的Functional Interface时,需要遵循以下规则:
- 该接口只能包含一个抽象方法
- 该接口可以包含一个或多个默认方法
- 该接口可以包含一个或多个静态方法
以下是一个自定义的Functional Interface的例子:
@FunctionalInterface
public interface MyInterface {
void doSomething();
default void run() {
System.out.println("MyInterface run");
}
static void stop() {
System.out.println("MyInterface stop");
}
}
我们可以将该接口转换为lambda表达式,并进行使用:
MyInterface myInterface = () -> System.out.println("hello");
myInterface.doSomething(); // Output: hello
myInterface.run(); // Output: MyInterface run
MyInterface.stop(); // Output: MyInterface stop
另外,当我们需要将Functional Interface转换为具体的类型时,可以使用::
符号来指向对应静态方法或构造函数,以下是一个构造函数转换的例子:
Supplier<Person> personSupplier = Person::new;
Person person = personSupplier.get();
以上便是Functional Interface的分类和使用详解内容。