函数式接口是Java 8引入的一种特殊接口,它只包含一个抽象方法,但可以有多个默认方法或静态方法。Lambda表达式是一种简洁的匿名函数,用于实现函数式接口的抽象方法。
例如:
@FunctionalInterface
interface MyFunctionalInterface {
void execute();
}
Lambda表达式可以这样实现:
java
MyFunctionalInterface myAction = () -> System.out.println("Action performed!");
myAction.execute();
简洁性:Lambda表达式减少了匿名内部类的样板代码,使代码更简洁。
可读性:通过Lambda表达式,代码逻辑更清晰,易于理解。
灵活性:Lambda表达式可以作为参数传递,支持函数式编程范式。
并行处理:结合Stream API,Lambda表达式可以轻松实现并行处理,提升性能。
这个主要体现在并行流-无敌好用的并行流
函数式接口的核心特点:
单一抽象方法:函数式接口中只能有一个抽象方法(不包括默认方法和静态方法)。
**@FunctionalInterface 注解**:虽然不是强制要求,但使用该注解可以明确标记一个接口为函数式接口,并让编译器检查是否符合函数式接口的定义。如果不符合,编译器会报错。
与 Lambda 表达式的关系:函数式接口是 Lambda 表达式的基础。Lambda 表达式可以看作是函数式接口的匿名实现类,简化了代码的书写。
Java 8 在 java.util.function 包中提供了许多内置的函数式接口,以下是常见的几种:
抽象方法:void accept(T t)
用途:消费一个输入参数,无返回值。
示例:
java
Consumer<String> print = s -> System.out.println(s);
print.accept("Hello, World!"); // 输出: Hello, World!
抽象方法:T get()
用途:提供一个返回值,无输入参数。
示例:
java
Supplier<String> supply = () -> "Hello, World!";
System.out.println(supply.get()); // 输出: Hello, World!
抽象方法:R apply(T t)
用途:接受一个输入参数,返回一个结果。
示例:
java
Function<String, Integer> length = s -> s.length();
System.out.println(length.apply("Hello")); // 输出: 5
抽象方法:boolean test(T t)
用途:测试一个输入参数是否满足条件。
示例:
java
Predicate<String> isLong = s -> s.length() > 5;
System.out.println(isLong.test("Hello")); // 输出: false
java
@FunctionalInterface
public interface StringProcessor {
String process(String input);
}
使用示例:
java
StringProcessor toUpper = str -> str.toUpperCase();
System.out.println(toUpper.process("hello")); // 输出 "HELLO"
java
@FunctionalInterface
public interface Validator {
boolean validate(String input);
}
使用示例:
java
Validator validator = s -> s.length() > 5;
System.out.println(validator.validate("Hello")); // 输出 false
java
@FunctionalInterface
public interface Operation {
int apply(int a, int b);
}
使用示例:
java
Operation add = (a, b) -> a + b;
Operation multiply = (a, b) -> a * b;
Operation complexOperation = (a, b) -> add.apply(a, b) + multiply.apply(a, b);
System.out.println(complexOperation.apply(3, 4)); // 输出 19
函数式接口是 Java 8 引入的一个重要特性,它为 Lambda 表达式和 Stream API 提供了基础支持。通过函数式接口,可以将行为作为参数传递,从而实现更灵活、更简洁的代码。在实际开发中,合理使用函数式接口可以显著提升代码的可读性和可维护性。同时,Java 内置的 java.util.function 包提供了丰富的函数式接口,可以满足大多数场景的需求。