java - Java 8 提供函数式风格但不是函数式编程的说法是否属实?
问题描述
Java 8 提供了函数式风格但不是函数式编程,因为它使用的语法也是一个对象,这句话是真的吗?
Calculator calc = (i, j) -> i/j;
如果是,那为什么我们到处都能看到关于 Java 8 函数式编程的文章?
解决方案
以下是抽象 FP 概念的(非详尽的)列表:
- 专注于不变性
- 函数的引用透明度
- 副作用的限制(遵循 1 和 2)
- 基于表达式,无语句。陈述不是一流的。
- 函数作为一等值。
- 状态更改为一等值(例如 Clojure 原子)。
- 代数数据类型作为基本单位。
- 通过类型系统执行上述部分或全部。
我可以继续。一种语言不必勾选列表中的每个框才能成为“函数式编程语言”(我实际上想不出任何符合所有这些要点的语言),但是它勾选的框越多,您拥有的资格就越少给给它那个标签。这就是为什么 Java 在许多函数式程序员眼中不合格的原因:它只是不检查上述项目中的很多(可以说只有一项)。
这并不是说你不能用 Java 进行函数式编程,但这很难。该语言为您提供的工具太少,这意味着您必须编写大量样板来将必要的原语编码为类,这意味着您的代码将变得更慢且更难遵循(这是在您获得之前这些原语的 15 个不同的竞争临时库实现的问题)。
您可以将您的对象视为不可变的,偏爱表达式而不是语句(例如使用三元运算符而不是 if/else),使您的大多数方法成为纯函数,使用 lambdas 等,但归根结底有仍然有很多摩擦,无论是语言还是社区的期望。
推荐阅读
- java - 如何为从多个表连接的对象定义 Ignite Cache
- android - 回到被破坏的活动后,RecyclerView 变空
- r - 在 R 中,当您不知道所有数据集中有多少列时,如何提取列?
- javascript - 如何设置 Svelte 项目以从 TS 导入组件?
- python - 在 Jupyter 笔记本中使用 Geopy - 我的 lambda 查询不起作用
- c - 带有字符和常量数组的 if 语句的 SSE Intrinsics
- c++ - Xerces-C++ XMLString::patternMatch() 无法正常运行
- repository - 您如何使用正确的参数调用 reposync 来指定您关心的一系列 CentOS 版本并排除其他版本?
- java - 从其他类中的 JButton 操作调用方法
- flutter - Flutter - 'showSnackBar' 已弃用 - 如何更新?