@@ -1429,9 +1429,9 @@ Hup Hey
1429
1429
1430
1430
** [ 1] ** 这一连串的箭头很巧妙。* 注意* ,在函数接口声明中,第二个参数是另一个函数。
1431
1431
1432
- ** [ 2] ** 柯里化的目的是能够通过提供一个参数来创建一个新函数 ,所以现在有了一个“带参函数”和剩下的 “自由函数”(free argumnet ) 。实际上,你从一个双参数函数开始,最后得到一个单参数函数。
1432
+ ** [ 2] ** 柯里化的目的是能够通过提供单个参数来创建一个新函数 ,所以现在有了一个“带参函数”和剩下的 “自由函数”(free argument ) 。实际上,你从一个双参数函数开始,最后得到一个单参数函数。
1433
1433
1434
- 我们可以通过添加级别来柯里化一个三参数函数 :
1434
+ 我们可以通过继续添加层级来柯里化一个三参数函数 :
1435
1435
1436
1436
``` java
1437
1437
// functional/Curry3Args.java
@@ -1460,7 +1460,7 @@ public class Curry3Args {
1460
1460
Hi Ho Hup
1461
1461
```
1462
1462
1463
- 对于每个级别的箭头级联 (Arrow-cascading),你都要在类型声明中包裹另一层 ** Function** 。
1463
+ 对于每一级的箭头级联 (Arrow-cascading),你都会在类型声明周围包裹另一个 ** Function** 。
1464
1464
1465
1465
处理基本类型和装箱时,请使用适当的函数式接口:
1466
1466
@@ -1491,17 +1491,17 @@ public class CurriedIntAdd {
1491
1491
## 纯函数式编程
1492
1492
1493
1493
1494
- 即使没有函数式支持,像 C 这样的基础语言,也可以按照一定的原则编写纯函数式程序 。Java 8 让函数式编程更简单,不过我们要确保一切是 ` final ` 的,同时你的所有方法和函数没有副作用。因为 Java 在本质上并非是不可变语言,所以编译器对我们犯的错误将无能为力。
1494
+ 只要多加练习,用没有函数式支持的语言也可以写出纯函数式程序(即使是 C 这样的原始语言) 。Java 8 让函数式编程更简单,不过我们要确保一切是 ` final ` 的,同时你的所有方法和函数没有副作用。因为 Java 在本质上并非是不可变语言,所以编译器对我们犯的错误将无能为力。
1495
1495
1496
- 这种情况下,我们可以借助第三方工具[ ^ 9 ] ,但使用 Scala 或 Clojure 这样的语言可能更简单。因为它们从一开始就是为保持不变性而设计的。你可以采用这些语言来编写你的 Java 项目的一部分。如果必须要用纯函数式编写,则可以用 Scala(需要遵循一些规则 ) 或 Clojure (遵循的规则更少 )。虽然 Java 支持[ 并发编程] ( ./24-Concurrent-Programming.md ) ,但如果这是你项目的核心部分,你应该考虑在项目部分功能中使用 ` Scala ` 或 ` Clojure ` 之类的语言。
1496
+ 这种情况下,我们可以借助第三方工具[ ^ 9 ] ,但使用 Scala 或 Clojure 这样的语言可能更简单。因为它们从一开始就是为保持不变性而设计的。你可以采用这些语言来编写你的 Java 项目的一部分。如果必须要用纯函数式编写,则可以用 Scala(需要一些练习 ) 或 Clojure (仅需更少的练习 )。虽然 Java 支持[ 并发编程] ( ./24-Concurrent-Programming.md ) ,但如果这是你项目的核心部分,你应该考虑在项目部分功能中使用 ` Scala ` 或 ` Clojure ` 之类的语言。
1497
1497
1498
1498
<!-- Summary -->
1499
1499
## 本章小结
1500
1500
1501
1501
1502
- Lambda 表达式和方法引用并没有将 Java 转换成函数式语言,而是提供了对函数式编程的支持。这对 Java 来说是一个巨大的改进。因为这允许你编写更简洁明了,易于理解的代码。在下一章中,你会看到它们在流式编程中的应用 。相信你会像我一样,喜欢上流式编程。
1502
+ Lambda 表达式和方法引用并没有将 Java 转换成函数式语言,而是提供了对函数式编程的支持。这对 Java 来说是一个巨大的改进。因为这允许你编写更简洁明了,易于理解的代码。在下一章中,你会看到它们在 * 流式编程(streams) * 中的应用 。相信你会像我一样,喜欢上流式编程。
1503
1503
1504
- 这些特性满足了很多羡慕Clojure、 Scala 这类更函数化语言的程序员,并且阻止了Java程序员转向那些更函数化的语言(就算不能阻止,起码提供了更好的选择 )。
1504
+ 这些特性满足了很大一部分的、羡慕Clojure 和 Scala 这类更函数化语言的Java程序员。阻止了他们投奔向那些语言(或者至少让他们在投奔之前做好准备 )。
1505
1505
1506
1506
但是,Lambdas 和方法引用远非完美,我们永远要为 Java 设计者早期的草率决定付出代价。特别是没有泛型 Lambda,所以 Lambda 在 Java 中并非一等公民。虽然我不否认 Java 8 的巨大改进,但这意味着和许多 Java 特性一样,它终究还是会让人感觉沮丧和鸡肋。
1507
1507
@@ -1516,7 +1516,7 @@ Lambda 表达式和方法引用并没有将 Java 转换成函数式语言,而
1516
1516
[ ^ 5 ] : 我还没有验证过这种说法。
1517
1517
[ ^ 6 ] : 当你理解了[ 并发编程] ( ./24-Concurrent-Programming.md ) 章节的内容,你就能明白为什么更改共享变量 “不是线程安全的” 的了。
1518
1518
[ ^ 7 ] : 接口能够支持方法的原因是它们是 Java 8 默认方法,你将在下一章中了解到。
1519
- [ ^ 8 ] : 一些语言,如 Python,允许像调用其他函数一样调用组合函数。但这是 Java,所以我们做做可为之事 。
1519
+ [ ^ 8 ] : 一些语言,如 Python,允许像调用其他函数一样调用组合函数。但这是 Java,所以我们要量力而行 。
1520
1520
[ ^ 9 ] : 例如,[ Immutables] ( https://immutables.github.io/ ) 和 [ Mutability Detector] ( https://mutabilitydetector.github.io/MutabilityDetector/ ) 。
1521
1521
1522
1522
0 commit comments