java中functional interface的分类和使用详解

在Java 8中,添加了对函数式编程的支持,也就引入了Functional Interface。Functional Interface是指只包含一个抽象方法的接口,它可以被转换为lambda表达式。在本文中,我们将详细介绍Functional Interface的分类和使用方式。

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。它包含两个参数TR,分别表示输入和输出类型。该接口只有一个方法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的分类和使用详解内容。

本文标题为:java中functional interface的分类和使用详解

基础教程推荐