【发布时间】:2021-08-11 03:35:36
【问题描述】:
函数接口是在 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));
那么使用函数有什么好处呢?正如它所指的函数式编程,Java 中的函数式编程究竟是什么,它可以带来什么好处?会不会像这样受益:
- 链接函数一起执行(例如 andThen & compose)
- 在 Java 中的用法
Stream? - 访问修饰符作为函数倾向于用私有而不是公共来定义,而方法可以是任何一个?
基本上,我很想知道,在什么情况下我们更喜欢使用函数而不是普通方法?有没有什么用例不能用或者很难用,或者用普通方法转换的?
【问题讨论】:
-
例如传递回调
-
是的,这可能是一种用法,但也可以像旧方式一样转换。特别是回调将在与调用者不同的情况下处理。但有时我在使用它作为回调时必须来回理解代码。
-
在this answer 中,我需要一个函数来传递给
Comparator,这将依赖于额外的输入(因此排序顺序将动态依赖)。使用静态方法声明需要为额外的输入添加一个字段,这会很丑陋。定义一个Function动态解决了它。 -
唯一的原因是当您想将函数视为对象时。没有理由将函数用于像您的示例这样微不足道的事情。
-
而实际上,在java中,这些分配给功能接口的maldas通过匿名类实现为对象。至少在几个版本前它是这样工作的;-)