Lambda可看作是匿名内部类,但是不产生.class文件
另:有且仅有一个抽象方法的接口,称为函数式接口
组成
- 一些参数
- 一个箭头
- 一段代码
标准格式
(参数类型 参数名称)→ {代码语句}
格式说明
- 小括号内的语法与传统参数列表相同。无参留空,多参使用逗号分隔。
- →代表指向动作
- 大括号内的与传统方法体要求一致
省略规则
- 小括号内的参数类型可以省略
- 如果小括号内有且仅有一个参数,则小括号可以省略
- 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号,return关键字及语句分号
使用前提
- 必须具有接口,切结口内有且仅有一个抽象方法
- 必须具有上下文推断,即:方法的参数或局部变量必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例
常用函数式接口
Supplier 生产型
java.util.function.Supplier<T>
无参方法:
- T get() 用来获取一个泛型参数指定类型的对象数据
Lambda需要"对外提供"一个符合泛型类型的对象
Consumer 消费型
java.util.function.Consumer<T>
抽象方法:
- void accept(T t) 意为消费一个指定泛型数据
默认方法:
- andThen 可以实现效果:消费一个数据的时候,首先做一个操作,燃油再做另一个操作,实现组合
想要实现组合,需要两个或多个Lambda表达式
Predicate 条件性 (用于判断)
java.util.function.Predicate<T>
需要对某种类型的数据进行判断,从而得到boolean值结果
抽象方法:
- boolean test(T t)
默认方法:
- and 与
- or 或
- negate 非
//方法 method(Predicate<String> p){ boolean b = p.test("TestString"); sout("包含T吗"+b); } //调用 main{ method(s→s.contains("T")); }
使用格式:
p1.and(p2).test("TestString"); p.negete().test("TestString");
Function 转换型
java.util.function.Function<T,R>
用来根据一个类型的数据得到另一个类型的数据,前者称之为前置条件,后者称之为后置条件,有进有出。称为函数Function。
抽象方法:
- R apply(T t) 根据T类型的参数获取R类型的结果
默认方法:
- andThen