首页 > 解决方案 > Java 8 提供函数式风格但不是函数式编程的说法是否属实?

问题描述

Java 8 提供了函数式风格但不是函数式编程,因为它使用的语法也是一个对象,这句话是真的吗?

 Calculator calc = (i, j) ->  i/j;

如果是,那为什么我们到处都能看到关于 Java 8 函数式编程的文章?

标签: javajava-8functional-programming

解决方案


以下是抽象 FP 概念的(非详尽的)列表:

  1. 专注于不变性
  2. 函数的引用透明度
  3. 副作用的限制(遵循 1 和 2)
  4. 基于表达式,无语句。陈述不是一流的。
  5. 函数作为一等值。
  6. 状态更改为一等值(例如 Clojure 原子)。
  7. 代数数据类型作为基本单位。
  8. 通过类型系统执行上述部分或全部。

我可以继续。一种语言不必勾选列表中的每个框才能成为“函数式编程语言”(我实际上想不出任何符合所有这些要点的语言),但是它勾选的框越多,您拥有的资格就越少给给它那个标签。这就是为什么 Java 在许多函数式程序员眼中不合格的原因:它只是不检查上述项目中的很多(可以说只有一项)。

这并不是说你不能用 Java 进行函数式编程,但这很难。该语言为您提供的工具太少,这意味着您必须编写大量样板来将必要的原语编码为类,这意味着您的代码将变得更慢且更难遵循(这是在您获得之前这些原语的 15 个不同的竞争临时库实现的问题)。

您可以将您的对象视为不可变的,偏爱表达式而不是语句(例如使用三元运算符而不是 if/else),使您的大多数方法成为纯函数,使用 lambdas 等,但归根结底有仍然有很多摩擦,无论是语言还是社区的期望。


推荐阅读