知行合一

博客园 首页 新随笔 联系 订阅 管理

01-lambda表达式举例与语法

1. Lambda表达式的使用举例:

(o1, o2) -> Integer.compare(o1,o2);

2. Lambda表达式的格式举例:

lambda形参列表 -> lambda体


3. Lambda表达式的格式

-> : lambda操作符或箭头操作符
-> 的左边: lambda形参列表,对应着要重写的接口中的抽象方法的形参列表。
-> 的右边: lambda体,对应着接口的实现类要重写的方法的方法体。

4. Lambda表达式的本质:
> 一方面,lambda表达式作为接口的实现类的对象。  ---> "万事万物皆对象"
> 另一方面,lambda表达式是一个匿名函数。


5. 函数式接口:
5.1 什么是函数式接口?为什么需要函数式接口?

> 如果接口中只声明有一个抽象方法,则此接口就称为函数式接口。

> 因为只有给函数式接口提供实现类的对象时,我们才可以使用lambda表达式。


5.2 api中函数式接口所在的包

jdk8中声明的函数式接口都在java.util.function包下。


5.3 4个基本的函数式接口
          接口            对应的抽象方法
消费型接口:Consumer<T>     void accept(T t)
供给型接口:Supplier<T>     T get()
函数型接口:Function<T,R>   R apply(T t)
判断型接口:Predicate<T>    boolean test(T t)

6. Lambda表达式的语法规则总结

-> 的左边:lambda形参列表,参数的类型都可以省略。如果形参只有一个,则一对()也可以省略。

-> 的右边:lambda体,对应着重写的方法的方法体。如果方法体中只有一行执行语句,则一对{}可以省略。
                                       如果有return关键字,则必须一并省略。

02-方法引用

1. 举例:
Integer :: compare;

2. 方法引用的理解
> 方法引用,可以看做是基于lambda表达式的进一步刻画。
> 当需要提供一个函数式接口的实例时,我们可以使用lambda表达式提供此实例。
    > 当满足一定的条件的情况下,我们还可以使用方法引用或构造器引用替换lambda表达式。

3. 方法引用的本质:
方法引用作为了函数式接口的实例。  ---> “万事万物皆对象”

4. 格式:
类(或对象) :: 方法名

5. 具体使用情况说明:
情况1:对象 :: 实例方法

要求:函数式接口中的抽象方法a与其内部实现时调用的对象的某个方法b的形参列表和返回值类型都相同(或一致)。
此时,可以考虑使用方法b实现对方法a的替换、覆盖。此替换或覆盖即为方法引用。

注意:此方法b是非静态的方法,需要对象调用。


情况2:类 :: 静态方法

要求:函数式接口中的抽象方法a与其内部实现时调用的类的某个静态方法b的形参列表和返回值类型都相同(或一致)。
此时,可以考虑使用方法b实现对方法a的替换、覆盖。此替换或覆盖即为方法引用。

注意:此方法b是静态的方法,需要类调用。


情况3: 类 :: 实例方法

要求:函数式接口中的抽象方法a与其内部实现时调用的对象的某个方法b的返回值类型相同。
    同时,抽象方法a中有n个参数,方法b中有n-1个参数,且抽象方法a的第1个参数作为方法b的调用者,且抽象方法a
    的后n-1个参数与方法b的n-1个参数的类型相同(或一致)。则可以考虑使用方法b实现对方法a的替换、覆盖。此替换或覆盖即为方法引用。

注意:此方法b是非静态的方法,需要对象调用。但是形式上,写出对象a所属的类 (笔误,改为:写成对象所属的类)

03-构造器引用、数组引用

1. 构造器引用
1.1 格式:
类名 :: new

1.2 说明:
> 调用了类名对应的类中的某一个确定的构造器
> 具体调用的是类中的哪一个构造器呢?取决于函数式接口的抽象方法的形参列表!

2. 数组引用
格式:数组名[] :: new

 

posted on 2024-01-14 16:42  callbin  阅读(27)  评论(0编辑  收藏  举报