Java 8实战[试读]
1.1 Java怎么还在变
本章内容 Java怎么又变了 日新月异的计算应用背景:多核和处理大型数据集(大数据) 改进的压力:函数式比命令式更适应新的体系架构 Java 8的核心新特性:Lambda(匿名函数)、流、默认方法 自1998年JDK 1.0(Java 1.0)发布以来,Java已经受到了学生、项目经理和程序员等一大批活跃用户的欢迎。这一语言极富活力,不断被用在大大小小的项目里。从Java 1.1(1997年) 一直到Java 7(2011年),Java通过增加新功能,不断得到良好的升级。Java 8则是在2014年3月发布的。那么,问题来了... 查看全部[ 1.1 Java怎么还在变 ]
1.2 Java中的函数
编程语言中的函数一词通常是指方法,尤其是静态方法;这是在数学函数,也就是没有副作用的函数之外的新含义。幸运的是,你将会看到,在Java 8谈到函数时,这两种用法几乎是一致的。 Java 8中新增了函数——值的一种新形式。它有助于使用1.3节中谈到的流,有了它,Java 8可以进行多核处理器上的并行编程。我们首先来展示一下作为值的函数本身的有用之处。 想想Java程序可能操作的值吧。首先有原始值,比如42(int类型)和3.14(double类型)。 其次,值可以是对象(更严格地说是对象的引用)。获得对象的唯一途径是利用new,也许是通过工厂方法或库函数实现的;对象引用指向类的一个实... 查看全部[ 1.2 Java中的函数 ]
1.3 流
几乎每个Java应用都会制造和处理集合。但集合用起来并不总是那么理想。比方说,你需要从一个列表中筛选金额较高的交易,然后按货币分组。你需要写一大堆套路化的代码来实现这个数据处理命令,如下所示: Map<Currency, List<Transaction>> transactionsByCurrencies = new HashMap<>(); for (Transaction transaction : transactions) { if(transaction.getPrice() > 1000){ ... 查看全部[ 1.3 流 ]
1.4 默认方法
Java 8中加入默认方法主要是为了支持库设计师,让他们能够写出更容易改进的接口。这一点会在第9章中详谈。这一方法很重要,因为你会在接口中遇到越来越多的默认方法,但由于真正需要编写默认方法的程序员相对较少,而且它们只是有助于程序改进,而不是用于编写任何具体的程序,我们这里还是不要啰嗦了,举个例子吧。 在1.3节中,我们给出了下面这段Java 8示例代码: List<Apple> heavyApples1 = inventory.stream().filter((Apple a) -> a.getWeight() > 150) ... 查看全部[ 1.4 默认方法 ]
1.5 来自函数式编程的其他好思想
前几节介绍了Java中从函数式编程中引入的两个核心思想:将方法和Lambda作为一等值,以及在没有可变共享状态时,函数或方法可以有效、安全地并行执行。前面说到的新的Stream API把这两种思想都用到了。 常见的函数式语言,如SML、OCaml、Haskell,还提供了进一步的结构来帮助程序员。其中之一就是通过使用更多的描述性数据类型来避免null。确实,计算机科学巨擘之一托尼•霍尔(Tony Hoare)在2009年伦敦QCon上的一个演讲中说道: 我把它叫作我的“价值亿万美金的错误”。就是在1965年发明了空引用……我无法抗拒放进一个空引用的诱惑,仅仅是因为它实现起来非常容易... 查看全部[ 1.5 来自函数式编程的其他好思想 ]
1.6 小结
以下是你应从本章中学到的关键概念。 请记住语言生态系统的思想,以及语言面临的“要么改变,要么衰亡”的压力。虽然Java可能现在非常有活力,但你可以回忆一下其他曾经也有活力但未能及时改进的语言的命运,如COBOL。 Java 8中新增的核心内容提供了令人激动的新概念和功能,方便我们编写既有效又简洁的程序。 现有的Java编程实践并不能很好地利用多核处理器。 函数是一等值;记得方法如何作为函数式值来传递,还有Lambda是怎样写的。 Java 8中Streams的概念使得Collections的许多方面得以推广,让代码更为易读,并允... 查看全部[ 1.6 小结 ]