java - 使用 Java 函数而不是普通方法的好处?
问题描述
Java 8 中引入了函数接口,用于在 Java 中实现函数式编程。它表示一个接受一个参数并产生结果的函数。它易于练习和阅读,但我仍在努力了解它的好处,而不仅仅是让它看起来很酷。例如,
Function<Integer, Double> half = a -> a / 2.0;
Function<Double, Double> triple = b -> b * 3;
double result = half.andThen(triple).apply(8);
可以转换为标准方法,例如
private Double half(int a) {
return a / 2.0;
}
private Double triple (int b) {
return b * 3;
}
double result = triple(half(8));
那么使用 Function 有什么好处呢?当它提到函数式编程时,Java 中的函数式编程究竟是什么以及它可以带来什么好处?它会以如下方式受益吗:
- 将函数链接在一起执行(例如 andThen & compose)
- Java 内部的用法
Stream
? - 访问修饰符作为函数倾向于用私有而不是公共定义,而方法可以是?
基本上,我很想知道,在什么情况下我们更喜欢使用函数而不是普通方法?是否有任何无法或难以使用的用例,或用正常方法转换的用例?
解决方案
的一种用法Function
是在 Streams 中。这些天每个人都使用map
方法,我相信:
此map
方法接受Function
作为参数。这允许编写非常优雅的代码——这是在 Java 8 之前无法实现的:
Stream.of("a", "b", "c")
.map(s -> s.toUpperCase())
.collect(Collectors.toList());
// List of A, B, C
现在确实存在方法引用和功能接口(其中之一Function
当然是),这使您可以使用方法引用将上面的示例重写为:
Stream.of("a", "b", "c")
.map(String::toUpperCase)
.collect(Collectors.toList())
...但这只是一个语法糖 -当然map
仍然接受Function
作为参数。
另一个使用Function
Java 本身的例子是StackWalker
: 这是一个例子:
List<StackFrame> frames = StackWalker.getInstance().walk(s ->
s.dropWhile(f -> f.getClassName().startsWith("com.foo."))
.limit(10)
.collect(Collectors.toList()));
}
注意对walk
方法的调用——它接受一个函数作为参数。
所以归根结底,它只是另一个可以帮助程序员表达他/她意图的工具。在适当的地方明智地使用它。
推荐阅读
- sql - 正则表达式用 sql 捕获模式
- email - Netsuite 电子邮件 > 自定义字段的 IF 声明
- .net - Bamboo 单元测试集成错误:CORBA 连接失败,次要代码为 4000
- mysql - MySQL加入2个表错误的输出..值相乘
- typescript - 从受约束的泛型参数中提取数据属性名称
- reactjs - React:将状态或数据从父组件传递到对象中的子组件
- html - fa 图标被 Disqus 评论计数覆盖
- reactjs - 如何使用 React 测试库测试选择选项逻辑
- postgresql - 如何替换 postgresql 数据中的文本?
- nixos - 如何在 NixOS 中安装 unison-gtk?