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

2023-12-11java编程
90

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的分类和使用详解内容。

The End

相关推荐

一文带你掌握Java8中Lambda表达式 函数式接口及方法构造器数组的引用
Lambda表达式是Java 8中引入的新特性之一,它是一个匿名函数,可以捕获参数并表现为一个代码块,而不像方法一样需要一个固定的名称。它主要用于传递行为或代码块以及事件处理等操作。...
2023-12-11 java编程
30

基于Java 谈回调函数
下面为您详细讲解基于Java的回调函数。...
2023-12-11 java编程
21

java equals函数用法详解
在Java中,equals()是用来比较两个对象是否相等的函数。equals()方法是Object类中的方法,因此所有Java类都包含equals()方法。在默认情况下,equals()方法比较对象的引用地址是否相同,即两个对象是否是同一个实例。但是,我们可以覆盖equals()方法,来定义自...
2023-12-11 java编程
63

JavaWeb学习笔记分享(必看篇)
JavaWeb是Java在Web领域的应用,是目前非常热门的技术之一。但是JavaWeb涉及到的技术非常广泛,初学者很容易迷失方向。本文总结了JavaWeb的基础知识,为初学者提供了一份学习笔记分享,希望能够帮助大家快速入门。...
2023-12-11 java编程
8

Java中replace、replaceAll和replaceFirst函数的用法小结
在Java编程中,字符串操作是很常见的,而替换字符串是其中常用的操作之一。Java提供了三种函数用于替换字符串:replace、replaceAll和replaceFirst。这篇文章将为您详细介绍它们的用法。...
2023-12-11 java编程
121

基于Java中进制的转换函数详解
进制是数学中一种表示数值大小的方法,常见的进制有10进制、2进制、16进制等。...
2023-12-11 java编程
45