第三章 Lambda 表达式

一、Lambda管中窥豹

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

2、基本语法:

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

二、在哪里以及如何使用Lambda

1、函数式接口

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

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

2、函数描述符

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

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

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

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

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

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

}

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

3、第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、第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);

四、使用函数式接口

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

1、类型检查

类型检查过程可以分解为如下所示。

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

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

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

第四、test方法描述了一个函数描述符,它可以接收一个Apple,并返回一个boolean

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

2、同样的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()):

3、类型推断

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

4、使用局部变量

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

六、方法引用

1、管中窥豹

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

2、构造函数引用

七、Lambda和方法引用实战

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

1、比较器复合

(1)、逆序

(2)、比较器链

2、谓词复合

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

3、函数复合

九、数学中的类似思想

1、积分

2、与java8的Lambda联系起来

转载于:https://my.oschina.net/u/2427561/blog/2235925

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值