Java中的函数式接口:Consumer、Function、Predicate和Supplier
Java 8以后,加入了函数接口(Functional Interface)这个概念,将Lambda表达式与函数式接口结合使用,有效地提高了Java代码的简洁性和可读性。其中,Consumer、Function、Predicate和Supplier是Java中最常用的四种函数式接口。
1. Consumer
Consumer接口表示一个接受单个输入参数并且没有返回值的操作。它可以用来消费Lambda表达式,接受一个参数,然后对这个参数进行处理。它的函数签名为:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
其中,accept方法接受一个泛型对象T作为输入参数,没有返回值。下面是一个简单的示例:
public static void main(String[] args) {
Consumer<Integer> consumer = x -> System.out.println(x);
consumer.accept(10);
}
上面的代码中,我们通过Lambda表达式创建了一个Consumer对象,将其作为参数传递给accept方法,并输出了参数10。
2. Function
Function接口表示一个接受一个参数并返回结果的函数。它的泛型接口T是输入参数的类型,R是返回结果的类型。它的函数签名为:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
其中,apply方法接受一个泛型对象T作为输入参数,返回一个泛型对象R作为输出结果。下面是一个简单的示例:
public static void main(String[] args) {
Function<Integer, Integer> function = x -> x * x;
System.out.println(function.apply(10));
}
上面的代码中,我们通过Lambda表达式创建了一个Function对象,将其作为参数传递给apply方法,并输出了参数10的平方值100。
3. Predicate
Predicate接口表示一个接受一个参数并返回一个布尔值的函数。它的泛型接口T是输入参数的类型。它的函数签名为:
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
其中,test方法接受一个泛型对象T作为输入参数,返回一个布尔值作为输出结果。下面是一个简单的示例:
public static void main(String[] args) {
Predicate<Integer> predicate = x -> x > 0;
System.out.println(predicate.test(10));
}
上面的代码中,我们通过Lambda表达式创建了一个Predicate对象,将其作为参数传递给test方法,并判断参数是否大于0。
4. Supplier
Supplier接口表示一个无参数函数,返回一个值。它的泛型接口T是返回值的类型。它的函数签名为:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
其中,get方法返回一个泛型对象T作为输出结果。下面是一个简单的示例:
public static void main(String[] args) {
Supplier<Integer> supplier = () -> 10;
System.out.println(supplier.get());
}
上面的代码中,我们通过Lambda表达式创建了一个Supplier对象,并输出其返回值10。
总结:
Consumer、Function、Predicate和Supplier是Java中最常用的四种函数式接口。它们分别表示一个接受单个输入参数并没有返回值的操作、一个接受一个参数并返回结果的函数、一个接受一个参数并返回一个布尔值的函数,以及一个无参数函数,返回一个值。通过Lambda表达式,我们可以很方便地创建它们的对象,并在代码中使用。这是Java 8以后的一个重要特性,可以提高代码的简洁性和可读性。
