java - 使用 Java 函数而不是普通方法的好处?

标签 java java-8

Java 8 中引入了函数接口(interface),用于在 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 ?
  • 访问修饰符作为函数往往定义为私有(private)而不是公共(public),而方法可以是?

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

    最佳答案

    Function的一种用法在 Streams 中。大家都用map这些天的方法,我相信:
    map方法接受 Function作为参数。这允许编写非常优雅的代码——这是在 Java 8 之前无法实现的:

    Stream.of("a", "b", "c")
       .map(s -> s.toUpperCase())
       .collect(Collectors.toList());
    // List of A, B, C
    
    现在确实有方法引用和功能接口(interface)(其中之一当然是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 的电话方法 - 它接受一个函数作为参数。
    所以最重要的是,它只是另一个工具,可以帮助程序员表达他/她的意图。在适当的地方明智地使用它。

    关于java - 使用 Java 函数而不是普通方法的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68735701/

    相关文章:

    java - "could not find or load main class "cmd、Windows 10、jdk1.8.0_11

    generics - 具有通配符泛型类型的 Lambda

    java - 有人在附加的类图中识别出任何模式/反模式吗?

    java - 在 Quartz 中使用 property/xml 文件动态添加脚本作为作业

    java - 如何在spring boot-JPA-hibernate中获取所有表元数据?

    Java 8 : how to get the first number greater than 10 in a stream?

    java 8 : remove element from list if its not found in map key

    Java8 : Filter and compare 2 Lists with Lambda

    java - 在 JScrollPane 上设置滚动条

    Java:使用弱引用堆栈