Java 8 引入了函数式接口和 Lambda 表达式,这使得编写简洁、可读性强的函数式风格代码变得非常容易。Java 8 的 java.util.function 包中定义了一系列函数式接口,如 Function, Predicate, Consumer, Supplier 等,它们可以用于多种用途,例如数据转换、过滤、收集等。下面我将通过几个例子来介绍一些常用的函数式接口:
1. Function<T, R>Function
接口代表了一个接受一个类型参数 T 的输入,并产生一个类型 R 的结果的函数。它有一个抽象方法 apply。
示例
import java.util.function.Function;
public class FunctionExample {
public static void main(String[] args) {
// 定义一个 Function 对象
Function<Integer, Integer> square = x -> x * x;
// 使用 apply 方法
int result = square.apply(5); // 结果是 25
System.out.println("Square of 5 is: " + result);
// 连接多个 Function
Function<Integer, Integer> addOne = x -> x + 1;
Function<Integer, Integer> composed = square.andThen(addOne);
int composedResult = composed.apply(5); // 先平方再加一,结果是 26
System.out.println("Square and then add one of 5 is: " + composedResult);
}
}
2. PredicatePredicate
接口代表了一个接受一个类型 T 的输入,并返回一个布尔值的结果。它有一个抽象方法 test。
示例
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class PredicateExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 定义一个 Predicate 对象
Predicate<Integer> evenNumber = n -> n % 2 == 0;
// 使用 Predicate 过滤列表中的元素
numbers.stream()
.filter(evenNumber)
.forEach(System.out::println);
}
}
3. ConsumerConsumer
接口代表了一个接受一个类型 T 的输入,并且不返回任何结果的操作。它有一个抽象方法 accept。
示例
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class ConsumerExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 定义一个 Consumer 对象
Consumer<String> printUpperCase = name -> System.out.println(name.toUpperCase());
// 使用 Consumer 处理列表中的每个元素
names.forEach(printUpperCase);
}
}
4. SupplierSupplier
接口代表了一个无参且返回一个类型 T 的结果的操作。它有一个抽象方法 get。
示例
import java.util.function.Supplier;
public class SupplierExample {
public static void main(String[] args) {
// 定义一个 Supplier 对象
Supplier<String> getRandomName = () -> "John Doe";
// 使用 Supplier 获取一个随机名字
String name = getRandomName.get();
System.out.println("Random name: " + name);
}
}
这些例子展示了如何使用 Java 8 的函数式接口来编写简洁的代码。这些接口在处理集合、数据流等方面非常有用。