《java8实战》笔记(1-5章)
Java 8实战
Raoul
关于本书
Java 8的流支持这种简明的数据库查询式编程——但用的是Java语法,而无需了解数据库!其次,流被设计成无需同时将所有的数据调入内存(甚至根本无需计算),这样就可以处理无法装入计算机内存的流数据了。
Java 8可以对流做一些集合所不能的优化操作,例如,它可以将对同一个流的若干操作组合起来,从而只遍历一次数据,而不是花很大代价去多次遍历它。更妙的是,Java可以自动将流操作并行化(集合可不行)。
第1章 为什么要关心Java 8
从有点修正主义的角度来看,在Java 8中加入Streams可以看作把另外两项扩充加入Java 8的直接原因:把代码传递给方法的简洁方式(方法引用、Lambda)和接口中的默认方法。
Java 8可以透明地把输入的不相关部分拿到几个CPU内核上去分别执行你的Stream操作流水线,但是写代码时不能访问共享的可变数据,即需要保证在多线程操作时,数据是线程安全的
在多个处理器内核之间使用synchronized,其代价往往比你预期的要大得多,因为同步迫使代码按照顺序执行,而这与并行处理的宗旨相悖
编程语言的整个目的就在于操作值,要是按照历史上编程语言的传统,这些值因此被称为一等值(或一等公民,这个术语是从20世纪60年代美国民权运动中借用来的)。
编程语言中的其他结构也许有助于我们表示值的结构,但在程序执行期间不能传递,因而是二等公民。前面所说的值是Java中的一等公民,但其他很多Java概念(如方法和类等)则是二等公民。用方法来定义类很不错,因此,Java 8的设计者决定允许方法作为值,让编程更轻松。
在Java 8里写下File::isHidden的时候,你就创建了一个方法引用,
我们说使用这些概念的程序为函数式编程风格,这句话的意思是“编写把函数作为一等值来传递的程序”。
我们把这种数据迭代的方法称为外部迭代。相反,有了Stream API,你根本用不着操心循环的事情。数据处理完全是在库内部进行的。我们把这种思想叫作内部迭代。
Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算。
Java中从函数式编程中引入的两个核心思想:将方法和Lambda作为一等值,以及在没有可变共享状态时,函数或方法可以有效、安全地并行执行。
第2章 通过行为参数化传递代码
**行为参数化**是可以帮助你处理频繁变更的需求的一种软件开发模式
行为参数化:让方法接受多种行为(或战略)作为参数,并在内部使用,来完成不同的行为。
DRY(Don’t Repeat Yourself,不要重复自己)的软件工程原则。
第3章 Lambda表达式
可以把**Lambda表达式**理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
一言以蔽之,**函数式接口就是只定义一个抽象方法的接口,**哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。
Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(具体说来,是函数式接口一个具体实现的实例)。
Lambda表达式可以被赋给一个变量,或传递给一个接受函数式接口作为参数的方法,当然这个Lambda表达式的签名要和函数式接口中抽象方法一样
注意你使用了Java 7中的带资源的try语句,它已经简化了代码,因为你不需要显式地关闭资源了)
1 |
|
java7 try-with-resources的实现方式,是使用了语法糖,需要关闭的资源的对象要实现AutoClose接口,在写在try语句块中,进行编译时就会在finally语句中调用close方法
Lambda表达式允许你直接内联,为函数式接口的抽象方法提供实现,并且将整个表达式作为函数式接口的一个实例。
函数式接口的抽象方法的签名称为函数描述符
java8 中的函数式接口
Predicate
java.util.function.Predicate接口定义了一个名叫test的抽象方法,它接受泛型T对象,并返回一个boolean。
Consumer
java.util.function.Consumer定义了一个名叫accept的抽象方法,它接受泛型T的对象,没有返回(void)。你如果需要访问类型T的对象,并对其执行某些操作,就可以使用这个方法
Function
java.util.function.Function<T, R>接口定义了一个叫作apply的方法,它接受一个泛型T的对象,并返回一个泛型R的对象。如果你需要定义一个Lambda,将输入对象的信息映射到输出,就可以使用这个接口
Supplier
java.util.function.Supplier
接口定义了一个get方法,它没有入参,只有一个返回泛型T的对象