predicate是判断型接口,接收一个参数返回boolean,用于过滤校验;function是转换型接口,输入t输出r,支持andthen/compose链式操作;consumer是执行型接口,接收参数无返回值,用于打印存库等副作用操作;supplier是供给型接口,无参返回t,适用于延迟初始化和工厂场景。

断言型接口 Predicate:做判断的“守门人”
它只干一件事:接收一个参数,返回 boolean 结果,用来表达“是否满足某个条件”。常用于过滤、校验、筛选等场景。
比如用 Predicate<string></string> 判断字符串是否非空且长度大于5:
Predicate<string> valid = s -> s != null && s.length() > 5;</string>valid.test("hello world"); // truevalid.test("hi"); // false
配合 Stream.filter() 使用最自然,是逻辑分流的关键组件。
函数型接口 Function:做转换的“翻译官”
它负责把一种类型的数据,按规则变成另一种类型——输入一个 T,输出一个 R。核心方法是 apply(T)。
典型用途包括字符串处理、对象字段提取、数值计算映射等:
Function<integer string> intToStr = i -> "num_" + i;</integer>intToStr.apply(42); // "num_42"-
Function<person string> getName = Person::getName;</person>(方法引用写法)
还支持链式操作:andThen() 和 compose(),可组合多个转换逻辑。
消费型接口 Consumer:做执行的“执行者”
它接收一个参数,不返回任何结果(void),专注“做了什么”,比如打印、存库、发消息、修改状态。
Consumer<string> printer = s -> System.out.println("→ " + s);</string>printer.accept("log message"); // 控制台输出 → log message- 常与
Stream.forEach()搭配,完成终端动作。
注意它不产生新数据,只触发副作用;若需链式消费,可用 andThen() 组合多个 Consumer。
供给型接口 Supplier:做产出的“生成器”
它不接收参数,只负责“凭空造出一个 T 类型的值”,对应方法是 get()。适合封装无参创建逻辑。
Supplier<localdatetime> now = () -> LocalDateTime.now();</localdatetime>Supplier<random> randGen = Random::new;</random>- 常用于延迟初始化、工厂模式简化、测试数据生成等场景。
和 Consumer 正好相反:一个只进不出,一个只出不进。











