Function 函数式接口
Function 是 Java 中的一个函数式接口,它表示接受一个输入参数并产生一个结果的函数。Function 接口定义了一个 apply 方法,用于对输入参数进行处理并返回结果。在函数式编程中,Function 接口常用于表示数据的转换或处理逻辑。
1 - 内置的函数式接口
在Java中,使用*@FunctionalInterface*注解来标识一个接口为函数式接口。函数式接口是指只包含一个抽象方法的接口。Java标准库中提供了许多内置的函数式接口,主要分为以下几类:
Supplier:供给型函数,表示提供一个结果而不接受任何输入参数。
javaimport java.util.function.Supplier; public class Example { public static void main(String[] args) { // 定义一个 Supplier,提供一个字符串结果 Supplier<String> supplier = () -> "Hello, World!"; // 获取结果并输出 String result = supplier.get(); System.out.println(result); } }
Consumer:消费型函数,表示接受一个输入参数并且不返回任何结果。
javaimport java.util.function.Consumer; public class Example { public static void main(String[] args) { // 定义一个 Consumer,打印输入的字符串 Consumer<String> consumer = str -> System.out.println("Input: " + str); // 执行消费操作 consumer.accept("Hello, World!"); } }
Runnable:无参无返回型函数,是一个特殊的消费型函数,表示执行一个不接受参数并且没有返回值的操作。
javapublic class Example { public static void main(String[] args) { // 定义一个 Runnable,执行打印操作 Runnable runnable = () -> System.out.println("Hello, World!"); // 执行操作 runnable.run(); } }
Function:有参有返回型函数,表示接受一个输入参数并且返回一个结果。
javaimport java.util.function.Function; public class Example { public static void main(String[] args) { // 定义一个 Function,将字符串转换为大写 Function<String, String> function = str -> str.toUpperCase(); // 调用函数并输出结果 String result = function.apply("hello, world!"); System.out.println(result); } }
2 - 使用技巧
- 链式调用
Function 接口的 andThen() 方法可以将多个函数连接在一起形成一个链式调用。这种方式可以使代码更加清晰和简洁。
java
import java.util.function.Function;
public class Example {
public static void main(String[] args) {
Function<Integer, Integer> add = x -> x + 2;
Function<Integer, Integer> multiply = x -> x * 3;
// 先加2再乘3
Function<Integer, Integer> addAndMultiply = add.andThen(multiply);
System.out.println(addAndMultiply.apply(5)); // 输出为21
}
}
- 组合函数
Function 接口的 compose() 方法可以将多个函数组合起来形成一个新的函数。这种方式可以在不改变原有函数的情况下创建新的函数。
java
import java.util.function.Function;
public class Example {
public static void main(String[] args) {
Function<Integer, Integer> add = x -> x + 2;
Function<Integer, Integer> multiply = x -> x * 3;
// 先乘3再加2
Function<Integer, Integer> multiplyAndAdd = add.compose(multiply);
System.out.println(multiplyAndAdd.apply(5)); // 输出为17
}
}
- 转换类型
Function 接口可以用于将一种类型的值转换为另一种类型的值。这种方式可以在不使用显式类型转换的情况下进行类型转换。
java
import java.util.function.Function;
public class Example {
public static void main(String[] args) {
Function<String, Integer> parseInt = Integer::parseInt;
int intValue = parseInt.apply("123");
System.out.println(intValue); // 输出为123
}
}
- 复杂的数据处理
Function 接口可以用于对复杂的数据进行处理,如集合元素的转换、过滤、映射等操作。
java
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Example {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Alice", "Bob");
// 将每个名字转换为大写
List<String> upperCaseNames = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperCaseNames);
}
}