使用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 中的函数式编程究竟是什么以及它可以带来的好处呢?它会不会像这样受益:

  1. 链接的执行一起函数(例如andThen & compose)
  2. Java内部使用 Stream
  3. 访问修饰符的功能趋于私人不公开的定义,而方法可以是?

基本上,我很想知道,在什么情况下我们更喜欢使用函数而不是普通方法?是否有无法或难以使用的用例,或使用正常方法转换的用例?

回答

的一种用法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));
}

这需要将函数表示为一个对象。

当您想在调用者提供的任意代码周围放置一些结构时,函数很有用。

  • 对我来说,这是创建和使用函数的主要原因。然后它们可以作为参数传递,就像变量一样。

以上是使用Java函数而不是普通方法的好处?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>