首页 > 解决方案 > 使用 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. 访问修饰符作为函数倾向于用私有而不是公共定义,而方法可以是?

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

标签: javajava-8

解决方案


的一种用法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方法的调用——它接受一个函数作为参数。

所以归根结底,它只是另一个可以帮助程序员表达他/她意图的工具。在适当的地方明智地使用它。


推荐阅读