跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Java Function接口
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本教程适用于Java 8及以上版本。}} = Java Function接口 = '''Function接口'''是Java 8引入的[[函数式接口]],位于`java.util.function`包中。它代表一个接受单一输入参数并返回结果的函数。在Lambda表达式和方法引用中广泛使用,是函数式编程的核心组件之一。 == 基本定义 == Function接口的泛型定义为: <syntaxhighlight lang="java"> @FunctionalInterface public interface Function<T, R> { R apply(T t); // 其他默认方法... } </syntaxhighlight> 其中: * '''T''':输入参数类型 * '''R''':返回结果类型 == 核心方法 == === apply() === 主要抽象方法,执行函数逻辑: <syntaxhighlight lang="java"> Function<String, Integer> lengthFunction = s -> s.length(); System.out.println(lengthFunction.apply("Hello")); // 输出:5 </syntaxhighlight> === compose() === 先执行参数中的函数,再执行当前函数: <syntaxhighlight lang="java"> Function<Integer, String> intToString = Object::toString; Function<String, String> quote = s -> "'" + s + "'"; Function<Integer, String> quoteIntToString = quote.compose(intToString); System.out.println(quoteIntToString.apply(123)); // 输出:'123' </syntaxhighlight> === andThen() === 先执行当前函数,再执行参数中的函数: <syntaxhighlight lang="java"> Function<Integer, Integer> times2 = e -> e * 2; Function<Integer, Integer> squared = e -> e * e; Function<Integer, Integer> composed = times2.andThen(squared); System.out.println(composed.apply(3)); // 输出:36 (3*2=6, 6²=36) </syntaxhighlight> == 特殊变体 == {| class="wikitable" |+ Function接口变体 ! 接口 !! 描述 !! 示例 |- | '''IntFunction<R>''' || 接受int参数 || <code>IntFunction<String> f = i -> "Value: "+i;</code> |- | '''DoubleFunction<R>''' || 接受double参数 || <code>DoubleFunction<String> f = d -> "Value: "+d;</code> |- | '''ToIntFunction<T>''' || 返回int结果 || <code>ToIntFunction<String> f = String::length;</code> |- | '''BiFunction<T,U,R>''' || 接受两个参数 || <code>BiFunction<String,String,Integer> f = (s1,s2) -> s1.length()+s2.length();</code> |} == 实际应用案例 == === 案例1:字符串处理流水线 === <syntaxhighlight lang="java"> Function<String, String> trim = String::trim; Function<String, String> toUpper = String::toUpperCase; Function<String, String> replaceVowels = s -> s.replaceAll("[aeiou]", "*"); Function<String, String> pipeline = trim.andThen(toUpper).andThen(replaceVowels); System.out.println(pipeline.apply(" hello world ")); // 输出:H*LL* W*RLD </syntaxhighlight> === 案例2:数据转换器 === <mermaid> flowchart LR A[原始数据] --> B(Function1: JSON解析) B --> C(Function2: 数据验证) C --> D(Function3: 转换为领域对象) D --> E[处理结果] </mermaid> <syntaxhighlight lang="java"> Function<String, Map<String,Object>> jsonParser = json -> { /* 解析逻辑 */ }; Function<Map<String,Object>, Boolean> validator = map -> { /* 验证逻辑 */ }; Function<Map<String,Object>, User> toUser = map -> new User(map); Function<String, Optional<User>> conversionPipeline = jsonParser .andThen(validator) .andThen(toUser) .andThen(Optional::ofNullable); </syntaxhighlight> == 数学表示 == Function接口可以表示为数学函数: <math>f: T \rightarrow R</math> 函数组合表示为: <math>(f \circ g)(x) = f(g(x))</math> 对应代码中的`compose()`方法。 == 性能考虑 == * 简单Lambda表达式会被JIT内联优化 * 复杂函数链可能产生临时对象 * 对于原始类型,考虑使用`IntFunction`等变体避免装箱 == 最佳实践 == 1. 保持函数纯净(无副作用) 2. 适当分解复杂函数链 3. 为业务意义的Function声明具名变量 4. 优先使用方法引用提高可读性 5. 注意空值处理(可结合Optional使用) {{Warning|避免在Function中修改外部状态,这违反了函数式编程原则}} == 进阶主题 == === 柯里化(Currying) === 将多参数函数转换为一系列单参数函数: <syntaxhighlight lang="java"> Function<Integer, Function<Integer, Integer>> adder = a -> b -> a + b; Function<Integer, Integer> add5 = adder.apply(5); System.out.println(add5.apply(3)); // 输出:8 </syntaxhighlight> === 函数组合 === 使用`compose()`和`andThen()`构建处理流水线: <mermaid> flowchart LR A --> B --> C --> D </mermaid> === 与Stream API结合 === <syntaxhighlight lang="java"> List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<Integer> lengths = names.stream() .map(String::length) .collect(Collectors.toList()); // lengths = [5, 3, 7] </syntaxhighlight> == 常见问题 == {{Q&A |question = Function和Predicate有什么区别? |answer = Predicate是返回boolean的特殊Function,可视为<code>Function<T, Boolean></code> }} {{Q&A |question = 什么时候应该使用BiFunction? |answer = 当需要处理两个输入参数时使用,但考虑是否可分解为两个单参数函数的组合 }} == 总结 == Function接口为Java带来了函数式编程能力,通过: * 将行为参数化 * 支持函数组合 * 与Lambda表达式完美配合 掌握Function接口可以显著提高代码的表达力和模块化程度。 [[Category:编程语言]] [[Category:Java]] [[Category:Java Lambda表达式]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Q&A
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)