第三章 Lambda 表达式

1、Lambda管中窥豹java

一、lambda没有名称,但它有参数列表,函数主体,返回类型,可能还有一个能够抛出的异常列表。express

二、基本语法:函数

(parameters)->expression
或
(parameters)->{statements;}

2、在哪里以及如何使用Lambdathis

一、函数式接口3d

(1)函数式接口就是只定义一个抽象方法的接口(能够有多个默认方法)code

(2)Lambda表达式容许你直接之内联的形式为函数式接口的抽象方法提供实现,并把整个表达式做为函数式接口的实例(具体来讲,是函数式接口一个具体实现的实例)对象

二、函数描述符blog

函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。接口

3、把Lambda付诸实践:环绕执行模式get

一、第1步,记得行为参数化

public static String processFileLimited() throws IOException {
    try (BufferedReader br =
                 new BufferedReader(new FileReader("lambdasinaction/chap3/data.txt"))) {
        return br.readLine();
    }
}

二、第2步,使用函数式接口来传递行为

public interface BufferedReaderProcessor{
   public String process(BufferedReader b) throws IOException;

}

public static String processFile(BufferedReaderProcessor p) throws IOException {
}

三、第3步:执行一个行为

public static String processFile(BufferedReaderProcessor p) throws IOException {
   try(BufferedReader br = new BufferedReader(new FileReader("lambdasinaction/chap3/data.txt"))){
      return p.process(br);
   }

}

四、第4步:传递Lambda

String oneLine = processFile((BufferedReader b) -> b.readLine());
System.out.println(oneLine);

String twoLines = processFile((BufferedReader b) -> b.readLine() + b.readLine());
System.out.println(twoLines);

4、使用函数式接口

5、类型检查、类型推断以及限制

一、类型检查

类型检查过程能够分解为以下所示。

首先、你要找出filter方法的声明

第2、要求它是Predicate<Apple>(目标类型)对象的第二个正式参数。

第3、Predicate<Apple>是一个函数式接口,定义了一个叫做test的抽象方法。

第4、test方法描述了一个函数描述符,它能够接收一个Apple,并返回一个boolean

最后、filter的任何实际参数都必须匹配这个要求。

二、一样的Lambda,不一样的函数式接口

Comparator<Apple> c1 =(Apple a1,Apple a2)->a1.getWeight().compareTo(a2.getWeight()):
ToIntBiFunction<Apple,Apple> c2 =(Apple a1, Apple a2)->a1.getWeight().compareTo(a2.getWeight()):
BiFunction<Apple,Apple,Integer> c3 =(Apple a1, Apple a2)->a1.getWeight().compareTo(a2.getWeight()):

三、类型推断

编译器能够了解Lambda表达式的参数类型,这样就能够在Lambda语法中省去标注参数类型。

四、使用局部变量

Lambda能够没有限制地捕获(也就是在其主体中引用)实例变量和静态变量。但局部变量必须显示声明final,或事实上是final。换句话说,Lambda表达式只能捕获指派给它们的局部变量。(注:捕获实例变量能够被看作捕获最终局部变量this)

6、方法引用

一、管中窥豹

使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面。

二、构造函数引用

7、Lambda和方法引用实战

8、符合Lambda表达式的有用方法

一、比较器复合

(1)、逆序

(2)、比较器链

二、谓词复合

谓词接口包括三个方法:neget、and和or

三、函数复合

9、数学中的相似思想

一、积分

二、与java8的Lambda联系起来

相关文章
相关标签/搜索