前言
Lambda表达式:jdk 8 引入的新特性
(参数1,参数2) -> { 函数...... }
函数式接口: 只有一个未实现方法的接口
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
函数作为方法的参数:实际就是用lambda表达式,快速实现函数式接口的“未实现的方法”
(入参个数得一样,返回值个数得一样)
Function func = (t) -> { return "t是"+t; } // 相当于实现了”函数式接口Function“的apply方法
// 问:为什么实现的是apply方法,而不是其他的?
// 答:注意看函数式接口的定义,”只有一个未实现方法“ !!!!!!!!!
t.apply("2") // 输出 t是2
t.apply("1","2") // 会报错,因为参数个数不一样
使用方式
1.正常使用
注意事项:
1.lambda表达式只能引用外部的final变量(也就是说不能修改外部变量)
2.lambda表达式可以创建局部变量
//静态方法引用, 如 Integer的parseInt(String s)
Function<String,Integer> func1 = (t)->{ return Integer.parseInt((String) t); };
func1.apply("123"); //输出123
//实例方法引用,如 str的substring
Function<String,String> func2 = (t) -> { return str.substring(0,2); };
func2.apply("1234"); //输出12
//构造方法引用,通过类名::new, 如 User的new
Function<String,User> func3 = (t) -> { return new User(t); };
func3.apply("名称123"); //这里调用了User的构造函数 User(String name)
2.简化方式 ( :: )
注意事项:
1.用来当作参数传递的函数,必须改为static的
2.上面的都能通过 :: 来简化(这里省略)
// 注意特例:
Function<Student,String> fun = Student::getName;
// 这里和之前说的完全不一样了:
// 首先,学生类的getName方法没有任何传参,和Function接口需要的1个入参不符,
// 讲道理是没法通过的,但是这里把入参设为 “Student”后,就愣是通过了!!!!!!
// 我的猜测是java检测到没有参数时,会把当前对象作为参数传进去!!!!!
优点:减少了重复代码