0Pricing
Java Academy · 课时

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 反馈 — 无需本地设置。

此课程中的所有课时

  1. Function 与 BiFunction
  2. Supplier 与 Consumer
  3. Predicate 与组合
  4. 自定义函数式接口
← 返回 Java Academy