Function 与 BiFunction
以函数式方式转换值
Function 与 BiFunction 是 CoddyKit 上的免费 Java Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。
Function 表示什么
Function<T, R> 是 java.util.function 中的核心转换接口。它接受一个 T 类型的参数,并返回一个 R 类型的结果。
- 它唯一的抽象方法是
R apply(T t)。 - 它表示从输入到输出的纯映射。
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, Integer> length = s -> s.length();
System.out.println(length.apply("hello"));
}
}调用 apply
调用 apply 即可使用 Function。Lambda 主体就是转换逻辑。
- 输入类型和输出类型可以不同。
- 像
String::toUpperCase这样的方法引用可以替代 Lambda。
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, String> upper = String::toUpperCase;
System.out.println(upper.apply("java"));
}
}andThen 组合
andThen 会链接多个函数:第一个函数的结果会成为第二个函数的输入。
f.andThen(g)表示 g(f(x))。- 阅读顺序是从左到右。
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<Integer, Integer> times2 = n -> n * 2;
Function<Integer, Integer> plus3 = n -> n + 3;
System.out.println(times2.andThen(plus3).apply(5));
}
}compose 组合
compose 会先运行作为参数的函数。
f.compose(g)表示 f(g(x))。- 它与
andThen的执行方向相反。
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<Integer, Integer> times2 = n -> n * 2;
Function<Integer, Integer> plus3 = n -> n + 3;
System.out.println(times2.compose(plus3).apply(5));
}
}Function.identity
Function.identity() 返回一个原样返回输入的函数。
- 它在流收集器和默认映射中很有用。
- 等价于
x -> x。
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, String> id = Function.identity();
System.out.println(id.apply("unchanged"));
}
}认识 BiFunction
BiFunction<T, U, R> 接受两个参数并返回一个结果。
- 它的方法是
R apply(T t, U u)。 - 它非常适合组合两个值,例如合并映射。
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
System.out.println(add.apply(4, 6));
}
}使用不同类型的 BiFunction
BiFunction 的三个类型参数可以各不相同。
- 这里将一个
String和一个int组合成一个String。
import java.util.function.BiFunction;
public class Main {
public static void main(String[] args) {
BiFunction<String, Integer, String> repeat = (s, n) -> s.repeat(n);
System.out.println(repeat.apply("ab", 3));
}
}BiFunction 与 andThen
BiFunction 同样支持 andThen,可以接收一个单参数的 Function 来对结果进行后处理。
BiFunction没有compose,因为它需要两个输入。
import java.util.function.BiFunction;
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
Function<Integer, String> label = n -> "sum=" + n;
System.out.println(add.andThen(label).apply(7, 8));
}
}集合中的函数
许多接口都会接受一个 Function。例如,Map.computeIfAbsent 会为缺失的键接受一个映射函数。
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> lengths = new HashMap<>();
lengths.computeIfAbsent("hello", String::length);
System.out.println(lengths);
}
}将函数存储在变量中
由于函数是对象,您可以存储、传递并返回函数。这是 Java 函数式风格的基础。
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<Integer, Integer> square = n -> n * n;
Function<Integer, Integer> cube = n -> n * n * n;
Function<Integer, Integer> chosen = square;
System.out.println(chosen.apply(5));
}
}构建转换流水线
反复链接 andThen 可以构建出易读且可复用的转换流水线。
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, String> trim = String::trim;
Function<String, String> upper = String::toUpperCase;
Function<String, Integer> len = String::length;
System.out.println(trim.andThen(upper).andThen(len).apply(" abc "));
}
}快速检查
f.andThen(g).apply(x) 计算什么?
回顾
您学习了核心转换接口:
Function<T,R>使用apply映射一个值。andThen向前链接(g(f(x));compose向后链接(f(g(x))。Function.identity()返回其输入。BiFunction<T,U,R>处理两个输入,并支持andThen但不支持compose。
常见问题解答
「Function 与 BiFunction」课时是免费的吗?
是的 — 「Function 与 BiFunction」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。
「Function 与 BiFunction」这节课中我会学到什么?
以函数式方式转换值 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Java Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「Function 与 BiFunction」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Java Academy 课中编写并运行代码吗?
能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- Function 与 BiFunction
- Supplier 与 Consumer
- Predicate 与组合
- 自定义函数式接口