java8 in action行为参数化

行为参数化:
拿出一个代码块,把它准备好却不去执行它。这个代码块以后可以被你程序的其他部分调用,这意味着你可以推迟这块代码的执行,例如你可以将代码块作为参数传递给另一个方法,稍后再去执行它。这样这个方法的行为就基于那块代码被参数化了。

List greenApples = filterApples(inventory,
                FilteringApples::isGreenApple);//方法引用:静态类的静态方法
        //FilteringApples::isGreenApple表示接收一个FilteringApples参数并返回一个boolean给filterApples(),
        //而filterApples则希望接收一个Predicate参数。
        //Predicate谓词在数学上常常用来代表一个类似函数的东西,它接收一个参数值,并返回true或false,java8也允许你写Function,但用Predicate是更标准的方式,效率也会更高一点,避免了将boolean封装到Boolean中。

和Collection API相比,Stream API处理数据的方式非常不同,用集合的话,你得自己去做迭代的过程,你得用for-each循环一个个去迭代元素,然后再处理元素。我们把这种数据迭代的方法称为外部迭代。而Stream API数据处理完全是在库内部进行的,我们把这种思想称作内部迭代。
java8利用Stream API解决了两个问题:集合处理时的套路和晦涩,以及难以利用的多核。
第一个问题:集合处理时的套路,我们在处理集合时要写很多套路代码,有了Stream,代码变的简洁。第二个问题:以及难以利用的多核,使用Stream,这些操作可以并行化。比如在两个CPU上筛选列表,可以让一个CPU处理列表的前一半,第二个CPU处理列表的后一半。然后CPU对各自的半个列表做筛选,最后,两个CPU把筛选结果合并起来。并行化利用了多核,并提高了效率。

Stream API和Collection API的行为差不多,它们都能够访问数据项目的序列,不过,Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算,Stream允许并提倡并行处理一个Stream中的元素。但筛选一个Collection的最快方法常常是将其转换为Stream,进行并行处理,然后再转换回List.

//如何利用Stream和lambda表达式顺序或并行地从一个列表里筛选出比较重的苹果。
//1,顺序处理:
        List heavyApples1 = inventory.stream().
                filter((Apple apple) -> 150

你可能感兴趣的:(java8 in action行为参数化)