Java 8常用函数式接口详解:Supplier、Consumer、Predicate与Function
在Java 8引入Lambda表达式后,java.util.function包提供了一系列常用的函数式接口以支持典型场景。本文将结合实例详细解析Supplier(生成)、Consumer(消费)、Predicate(判断)及Function(转换)四大核心接口,并探讨基本数据类型的专用接口以避免自动装箱拆箱的性能损耗。
准备:基础实体类定义
为了演示各类接口,首先定义一个表示口罩的简单类Mask:
package one.more.study;
public class Mask {
public Mask(String brand, String type) {
this.brand = brand;
this.type = type;
}
private String brand;
private String type;
public String getBrand() { return brand; }
public void setBrand(String brand) { this.brand = brand; }
public String getType() { return type; }
public void setType(String type) { this.type = type; }
}
第1步:使用Supplier获取对象实例
Supplier<T>是一个生产型接口,没有入参,通过get()方法返回泛型对象T。其源码位于java.util.function包下:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
使用Lambda表达式创建Mask实例:
Supplier<Mask> supplier = () -> new Mask("3M", "N95");
Mask mask = supplier.get();
System.out.println("Brand: " + mask.getBrand() + ", Type: " + mask.getType());
运行结果为:Brand: 3M, Type: N95。需注意每次调用get()都会创建一个新对象。
第2步:使用Consumer处理数据
Consumer<T>是消费者型接口,接收泛型T作为参数,无返回值。源码如下:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
结合上文的Supplier,先生产后消费:
Consumer<Mask> consumer = (Mask m) -> {
System.out.println("品牌: " + m.getBrand() + ", 类型: " + m.getType());
};
consumer.accept(supplier.get());
第3步:使用Predicate进行条件判断
Predicate<T>用于逻辑判断,输入T返回boolean。源码如下:
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
判断口罩类型是否为指定值:
Predicate<Mask> isN95 = m -> "N95".equals(m.getType());
System.out.println(isN95.test(supplier.get())); // true
第4步:使用Function进行数据转换
Function<T, R>用于将输入T转换为输出R。源码如下:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
提取口罩属性:
Function<Mask, String> brandFunc = m -> m.getBrand();
String b = brandFunc.apply(supplier.get()); // 3M
性能优化:基本数据类型专用接口
上述接口均为泛型引用类型,若用于int/long等基础类型会引发装箱拆箱。JDK提供了对应的专用接口以提升性能。
例如获取时间戳,应使用LongSupplier而非Supplier<Long>:
LongSupplier timeSupplier = () -> System.currentTimeMillis();
long now = timeSupplier.getAsLong();
补充:常用接口速查表
| 分类 | 接口名 | 关键方法签名 |
|---|---|---|
| Supplier系列 | BooleanSupplier | () → boolean |
| DoubleSupplier | () → double | |
| IntSupplier | () → int | |
| LongSupplier | () → long | |
| ObjDoubleConsumer | (T, double) → void |
更多类似接口如IntPredicate、ToIntFunction等遵循相同命名规范,可根据具体类型选择以避免性能损耗。
以上就是Java Lambda表达式常用的函数式接口的详细内容,更多关于Java函数式编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









