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

Java函数式接口入门指南

发布时间:2023-06-21 17:57:15

Java 8 中引入了函数式编程的支持,其中的函数式接口是重要的基础。本文将介绍Java 函数式接口的特点以及常见的函数式接口。

## 什么是函数式接口

函数式接口是只包含一个抽象方法的接口。在 Java 中,一个接口可以有多个默认方法,但只能有一个抽象方法。函数式接口重要的特点是可以支持 lambda 表达式。例如,可以用一个函数式接口实例化一个 lambda 表达式,从而简化代码。

函数式接口总是标注了 @FunctionalInterface 注解。这个注解可以确保只有一个抽象方法,而且在尝试添加新的抽象方法时会产生编译错误。

以 Supplier 接口为例,它是 Java 8 提供的一个函数式接口。Supplier 接口定义了一个函数 get(),没有输入参数但会返回一个值。实现一个 Supplier 接口的类如下所示:

public class MySupplier implements Supplier<String> {
    @Override
    public String get() {
        return "hello";
    }
}

函数式接口使得同样的类可以简化为 lambda 表达式:

Supplier<String> mySupplier = () -> "hello";

通过 @FunctionalInterface 注解,可以在编写错误的时候及时发现问题,如果一个类试图违反函数式接口的规定定义多个抽象方法,则会得到以下编译错误:

Multiple non-overriding abstract methods found in interface ...

## 常见的函数式接口

Java 8 引入了许多新的函数式接口。下表列出了常用的函数式接口。

| 接口 | 抽象方法 | 函数描述符 |

| --- | --- | --- |

| Consumer<T> | void accept(T t) | T -> void |

| Supplier<T> | T get() | () -> T |

| Function<T,R> | R apply(T t) | T -> R |

| Predicate<T> | boolean test(T t) | T -> boolean |

| BiConsumer<T,U> | void accept(T t, U u) | (T, U) -> void |

| BiFunction<T,U,R> | R apply(T t, U u) | (T, U) -> R |

### Consumer

Consumer 接口代表了一个接受单个输入的操作,并且不返回任何结果。可以使用它来表示一个操作将产生副作用,例如修改某些状态。

Consumer<String> myConsumer = (str) -> System.out.println(str);
myConsumer.accept("hello");

### Supplier

Supplier 接口代表了一个单独的输出,不接收输入参数。可以使用它来表示一个操作将仅返回一个值。

Supplier<String> mySupplier = () -> "hello";
String hello = mySupplier.get();

### Function

Function 接口代表了一个接收一个输入参数并生成一个结果的操作。

Function<String, Integer> myFunction = (str) -> str.length();
int length = myFunction.apply("hello");

### Predicate

Predicate 接口代表了一个单独的输入并生成一个布尔输出。

Predicate<String> myPredicate = (str) -> str.isEmpty();
boolean isEmpty = myPredicate.test("");

### BiConsumer

BiConsumer 接口代表了一个接受两个输入的操作,并且不返回任何结果。

BiConsumer<Integer, String> myBiConsumer = (i, str) -> System.out.println(i + str);
myBiConsumer.accept(1, "hello");

### BiFunction

BiFunction 接口代表了一个接收两个输入参数并生成一个结果的操作。

BiFunction<Integer, Integer, Integer> myBiFunction = (a, b) -> a + b;
int sum = myBiFunction.apply(1, 2);

## 总结

本文介绍了 Java 8 函数式接口的特点和示例。了解这些接口可以让您使用 lambda 表达式轻松编写简洁和优雅的代码。使用函数式接口和 lambda 表达式,您可以更好地利用多核处理器的优势来提高应用程序性能。