使用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作为参数。
另一个使用FunctionJava 本身StackWalker的例子是:这是一个例子:
List<StackFrame> frames = StackWalker.getInstance().walk(s ->
s.dropWhile(f -> f.getClassName().startsWith("com.foo."))
.limit(10)
.collect(Collectors.toList()));
}
注意调用 walk方法——它接受一个函数作为参数。
所以最重要的是,它只是另一个工具,可以帮助程序员表达他/她的意图。在适当的地方明智地使用它。
回答
假设我想写一个applyTwice函数:
double applyTwice(double x, Function<Double, Double> f) {
return f.apply(f.apply(x));
}
这需要将函数表示为一个对象。
当您想在调用者提供的任意代码周围放置一些结构时,函数很有用。
- 对我来说,这是创建和使用函数的主要原因。然后它们可以作为参数传递,就像变量一样。