1.lambda表达式
Java8中引入了一个新的操作符 “->” 该操作符称为箭头操作符或Lambda操作符,箭头操作符将Lambda表达式拆分为两部分
左侧:(参数)表示参数列表;
右侧:{}内部是方法体;
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
基本语法
<函数式接口> <变量名> = (参数,参数2...) -> { 方法体 }
特点
1.形参列表的数据类型会自动推断,也就是括号内的类型可省去。
2.如果形参列表为空,只需保留{};
3.如果形参只有一个,()可以省略,只需参数名称即可;
4.如果执行语句只有语句,且无返回值,{}可以省去,若有返回值,则若想省去{},必须同时省去return,且执行语句也必须只有一句;
5.拉姆达不会生成一个单独的内部类文件;
使用lambda表达式之前
使用lambda表达式之后
根据lambda特性,函数作为参数传递进方法中,可以简写为
什么是 匿名内部类(匿名函数)?
匿名内部类的特点:
1。没有类名
2。必须借助接口或父类
3。通过实例化函数式接口就可以完成匿名内部类实现此接口并重写方法
使用lambda表达式的前提是必须是函数式接口
常见函数式接口:
存在于java.util.function包下
接口名 | 参数 | 返回值 | 说明 |
Consumer<T> 消费型接口 | T | 无 | void accept(T t);对类型为T的对象应用操作 |
Supplier<T> 供给型接口 | 无 | T | T get(); 返回类型为T对象 |
Function<T,R> 函数型接口 | T | R | R apply(T t);对类型为T的对象应用操作,并返回类型为R类型的对象 |
Predicate<T> 断言型接口 | T | boolean | boolean test(T t);确定类型为T得对象是否满足条件,并返回boolean类型。 |
函数式接口:
如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口可以使用Lambda表达式。
@FunctionalIntegerface: 此注解规定此接口是个函数式接口
使用Lambda表达式的前提是需要有函数式接口。而Lambda使用时不关心接口名,抽象方法名,只关心抽 象方法的参数列表和返回值类型。因此为了让我们使用Lambda方便,JDK提供了大量常用的函数式接口。
无参无返回值:的拉姆达表达式:
消费型接口:有参无返回值:
供给型接口:无参有返回值:
函数型接口:有参有返回值 :
断言式接口:有参有返回值
方法引用
方法引用: 当lambda表达式有且仅有一条语句,而这条语句是调用了其他的方法。这时可以考虑使用方法引用。 lambda是此种形式就可以使用方法引用
[1]静态方法引用: 类名::静态方法 (参数)->类名.静态方法(参数)
[2]实例方法引用: 对象::实例方法 (参数)->对象.实例方法(参数)
[3]对象方法引用: 类名::实例方法. (参数1,参数2)->参数1.实例方法(参数2)
[4]构造方法引用: 类名::new (参数)->new 类名(参数)方法引用的提出: 由于如果存在一种情况,我们新建了多个接口的实现对象,其方法都是相同的,但是如果方法需要修改,那么修改的复杂度就随着对象数量的上升而上升。
方法引用的定义: 快速将一个Lambda表达式的实现指向一个已经写好的方法 方法引用可以看作是lambda表达式的特殊形式,或者称之为语法糖。一般方法已经存在才可以使用方法引用,而方法若未存在,则只能使用lambda表达式。
什么情况能使用:在这个lambda表达式中有且仅有一条语句,并且这条语句又调用了某个方法。g
常见形式
对象::实例方法
类::静态方法
类::实例方法
类::new
方法引用的分类
类型 | 语法 | 对应的lamabda表达式 |
静态方法引用 | 类名::staticMethod | (args)->类名.staticMethod(args) |
实例方法引用 | inst::instMethod | (args)->inst.instMethod(args) |
对象方法引用 | 类名::instMethod | (inst,args)->inst.instMethod(args) |
构建方法引用 | 类名::new | (args)-> new 类名(args) |
静态方法引用
实例方法引用
public class 实例方法引用 {
public static void main(String[] args) {
Peoplee peoplee = new Peoplee("张三",15);
/*Supplier<String> supplier = ()-> people.getName();*/
/*函数式接口用::非函数式用.*/
Supplier<String> supplier1 = ()->peoplee.getName();
fun(supplier1);
}
public static void fun(Supplier<String> supplier){
String s = supplier.get();
System.out.println("结果为"+s);
}
}
class Peoplee{
private String name;
private int age;
public Peoplee(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
对象方法引用
public class 对象方法引用 {
public static void main(String[] args) {
/*引用String 对象的 length 方法*/
Function<String,Integer> function =String::length;
Integer len = function.apply("asdfg");
System.out.println(len);
}
}