Java 中函数式接口实现链式调用处理的方法

作者:袖梨 2026-07-09
Java函数式接口通过内置组合方法实现链式调用:Function用andThen/compose、Predicate用and/or/negate、Consumer用andThen;Supplier无组合能力,不可链式调用。

Java 中函数式接口本身不直接支持链式调用,但可以通过组合(composition)实现类似效果——这不是靠“返回 this”,而是靠接口内置的 composeandThen 方法,让多个函数串起来执行。

Function 接口的链式转换

Function 是最典型的可链式组合的函数式接口。它定义了两个核心组合方法:

  • andThen(R → U):先执行当前函数,再对结果应用另一个函数(顺序执行)
  • compose(S → T):先执行传入函数,再执行当前函数(逆序执行)

例如:

  Function addTwo = x -> x + 2;
  Function multiplyByThree = x -> x * 3;
  Function pipeline = addTwo.andThen(multiplyByThree);
  int result = pipeline.apply(4); // 先 4+2=6,再 6*3=18

Predicate 的逻辑链式组合

Predicate 支持 andornegate 等默认方法,实现条件的叠加与取反:

立即学习“Java免费学习笔记(深入)”;

  • pred1.and(pred2):等价于 x -> pred1.test(x) && pred2.test(x)
  • pred1.or(pred2):等价于 x -> pred1.test(x) || pred2.test(x)
  • pred.negate():取反,常用于 filter 链中反转逻辑

实际使用如:

  Predicate isLong = s -> s.length() > 5;
  Predicate startsWithA = s -> s.startsWith("A");
  List filtered = list.stream()
    .filter(isLong.and(startsWithA))
    .collect(Collectors.toList());

Consumer 的链式消费

Consumer 提供 andThen 方法,用于按顺序执行多个消费动作:

  • 每个 Consumer 执行副作用(如打印、存库),不返回值
  • c1.andThen(c2) 表示先执行 c1,再执行 c2

例如:

  Consumer log = s -> System.out.println("LOG: " + s);
  Consumer save = s -> database.save(s);
  Consumer pipeline = log.andThen(save);
  pipeline.accept("order-1001"); // 先打印,再保存

Supplier 不支持链式组合

Supplier 只有一个无参方法 get(),没有组合能力——因为它不接收输入,无法像 Function 那样串联输入输出流。若需“链式获取”,需手动封装或借助 Optional/Stream 等中间结构:

  • 不能写 supplier1.andThen(supplier2)(编译报错)
  • 常见替代:用 Function 包装 Supplier 结果,或用 Stream.generate().limit(1).map(...) 模拟

真正意义上的链式调用,在函数式接口中体现为数据流的传递与转换,而非对象方法调用的 this 返回。理解这点,就能避开把 Supplier 或 Runnable 当成 fluent API 去强行链的误区。

相关文章

精彩推荐