Java 8实战1.5 来自函数式编程的其他好思想_Java 8实战1.5 来自函数式编程的其他好思想试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Java 8实战 > 1.5 来自函数式编程的其他好思想

Java 8实战——1.5 来自函数式编程的其他好思想

前几节介绍了Java中从函数式编程中引入的两个核心思想:将方法和Lambda作为一等值,以及在没有可变共享状态时,函数或方法可以有效、安全地并行执行。前面说到的新的Stream API把这两种思想都用到了。 常见的函数式语言,如SML、OCaml、Haskell,还提供了进一步的结构来帮助程序员。其中之一就是通过使用更多的描述性数据类型来避免null。确实,计算机科学巨擘之一托尼•霍尔(Tony Hoare)在2009年伦敦QCon上的一个演讲中说道: 我把它叫作我的“价值亿万美金的错误”。就是在1965年发明了空引用……我无法抗拒放进一个空引用的诱惑,仅仅是因为它实现起来非常容易。 在Java 8里有一个Optional<T>类,如果你能一致地使用它的话,就可以帮助你避免出现NullPointer异常。它是一个容器对象,可以包含,也可以不包含一个值。Optional<T>中有方法来明确处理值不存在的情况,这样就可以避免NullPointer异常了。换句话说,它使用类型系统,允许你表明我们知道一个变量可能会没有值。我们会在第10章中详细讨论Optional<T>。 第二个想法是(结构)模式匹配 。这在数学中也有使用,例如: f(0) = 1 f(n) = n*f(n-1) otherwise 在Java中,你可以在这里写一个if-then-else语句或一个switch语句。其他语言表明,对于更复杂的数据类型,模式匹配可以比if-then-else更简明地表达编程思想。对于这种数据类型,你也可以使用多态和方法重载来替代if-then-else,但对于哪种方式更合适,就语言设计而言仍有一些争论。 我们认为两者都是有用的工具,你都应该掌握。不幸的是,Java 8对模式匹配的支持并不完全,虽然我们会在第14章中介绍如何对其进行表达。与此同时,我们会用一个以Scala语言(另一个使用JVM的类Java语言,启发了Java在一些方面的发展;请参阅第15章)表达的例子加以描述。比方说,你要写一个程序对描述算术表达式的树做基本的简化。给定一个数据类型Expr代表这样的表达式,在Scala里你可以写以下代码,把Expr分解给它的各个部分,然后返回另一个Expr: def simplifyExpression(expr: Expr): Expr = expr match { case BinOp("+", e, Number(0)) => e case BinOp("*", e, Number(1)) => e case BinOp("/", e, Number(1)) => e case _ => expr } 这里,Scala的语法expr match就对应于Java中的switch (expr)。现在你不用担心这段代码,你可以在第14章阅读更多有关模式匹配的内容。现在,你可以把模式匹配看作switch的扩展形式,可以同时将一个数据类型分解成元素。 为什么Java中的switch语句应该限于原始类型值和Strings呢?函数式语言倾向于允许switch用在更多的数据类型上,包括允许模式匹配(在Scala代码中是通过match操作实现的)。在面向对象设计中,常用的访客模式可以用来遍历一组类(如汽车的不同组件:车轮、发动机、底盘等),并对每个访问的对象执行操作。模式匹配的一个优点是编译器可以报告常见错误,如:“Brakes类属于用来表示Car类的组件的一族类。你忘记了要显式处理它。” 第13章和第14章给出了完整的教程,介绍函数式编程,以及如何在Java 8中编写函数式风格的程序,包括其库中提供的函数工具。第15章讨论Java 8的功能并与Scala进行比较。Scala和Java一样是在JVM上实现的,且近年来发展迅速,在编程语言生态系统中已经在一些方面威胁到了Java。这部分内容在书的后面几章,会让你进一步了解Java 8为什么加上了这些新功能。

展开全文

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《Java 8实战》其他试读目录

• 1.1 Java怎么还在变
• 1.2 Java中的函数
• 1.3 流
• 1.4 默认方法
• 1.5 来自函数式编程的其他好思想 [当前]
• 1.6 小结