java8预科

2、Lambda表达式和方法引用

2.1、方法引用

  1. 在Java 8之前,没法把一个方法传给另一个方法;Java 8增加了把方法(你的代码)作为参数传递给另一个方法的能力,我们把这一概念称为行为参数化。

  2. Java 8中新增了函数——值的一种新形式。

  3. Java程序可能操作的值:原始值,比如42(int类型)和3.14(double类型);对象(更严格地说是对象的引用)。编程语言的整个目的就在于操作值,这些值因此被称为一等值(或一等公民);编程语言中的其他结构也许有助于我们表示值的结构,但在程序执行期间不能传递,因而是二等公民。在运行时传递方法能将方法变成一等公民,这在编程中非常有用,因此Java 8的设计者把这个功能加入到了Java中。

  4. Java 8的第一个新功能是方法引用

    File[] hiddenFiles = new File(".").listFiles(new FileFilter() { 
     public boolean accept(File file) { 
     return file.isHidden(); 
     } 
    });
    

    在Java 8里,你可以把代码重写成这个样子:

    File[] hiddenFiles = new File(".").listFiles(File::isHidden);
    

    用Java 8的方法引用::语法(即“把这个方法作为值”)将其传给listFiles方法。

    java 8中方法不再是二等值了,与用对象引用传递对象类似(对象引用是用new创建的),写下File::isHidden的时候,就创建了一个方法引用,你同样可以传递它。

  5. 谓词(predicate)

    在数学上常常用来代表一个类似函数的东西,它接受一个参数值,并返回true或false。你在后面会看到,Java 8也会允许你写Function<Apple,Boolean>——在学校学过函数却没学过谓词的读者对此可能更熟悉,但用Predicate是更标准的方式,效率也会更高一点儿,这避免了把boolean封装在Boolean里面。

2.2、Lambda——匿名函数

  1. 除了允许(命名)函数成为一等值外,Java 8还体现了更广义的将函数作为值的思想,包括Lambda(匿名函数)。比如,你现在可以写(int x) -> x + 1,表示“调用时给定参数x,就返回x + 1值的函数”。

  2. 把方法作为值来传递显然很有用,但要是为可能只用一两次的短方法写一堆定义有点儿烦人。这时候就用到匿名函数或Lambda了,让你可以写出

    filterApples(inventory, (Apple a) -> "green".equals(a.getColor()) ); 
    

    这样简洁的代码

2.3、函数式编程

  1. 使用方法引用Lambda——匿名函数的程序为函数式编程风格,这句话的意思是“编写把函数作为一等值来传递的程序”

3、Stream流

  1. Java 8在java.util.stream中添加了一个Stream API;Stream就是一系列T类型的项目。

  2. Stream API的很多方法可以链接起来形成一个复杂的流水线,就像先前例子里面链接起来的

    Unix命令(cat file1 file2 | tr "[A-Z]" "[a-z]" | sort | tail -3)一样。

  3. 现在你可以在一个更高的抽象层次上写Java 8程序了:思路变成了把这样的流变成那样的流(就像写数据库查询语句时的那种思路),而不是一次只处理一个项目。另一个好处是,Java 8可以透明地把输入的不相关部分拿到几个CPU内核上去分别执行你的Stream操作流水线——这是几乎免费的并行,用不着去费劲搞Thread了。

posted @ 2022-04-25 00:00  大于昨天  阅读(29)  评论(0编辑  收藏  举报