写在前边
实质属于函数式编程的概念,可返回一个接口的实现
//一次性的类,用在new Thread中充当Runnable对的实现类
class runnable implements Runnable{
@Override
public void run() {
System.out.println("我在路上");
}
}
public class lambdaTest {
public static void main(String[] args) {
runnable runnable = new runnable();
Thread thread1 = new Thread(runnable);
}
}
复制代码
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("我在路上");
}
});
复制代码
定义:任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口
public interface Runnable{
void run();
}
复制代码
为了避免后来人给这个接口添加函数后,导致该接口有多个函数,不再是函数式接口,我们可以在接口类的上方声明**@FunctionalInterface**
而这里我们用lambda实际上是等价于匿名内部类(没有类名),实际创建出来的类是什么,我们不知道,所以我们会定义成接口,利用多态的向上转型特性 关于多态的更多特性,在我的另一篇博客中 : 传送门->
//接口定义
interface parseIntNum{
//定义一个String转化成Integer的方法
int pass(String s);
}
public static void main(String[] args) {
parseIntNum parseIntNum1;
parseIntNum parseIntNum2;
//原始lambda
parseIntNum1 = (str)-> Integer.parseInt(str);
System.out.println(parseIntNum1.pass("1"));
//方法引用改进版本
parseIntNum2 = Integer::parseInt;
System.out.println(parseIntNum2.pass("1"));
}
复制代码
所谓方法引用,是指如果某个已经存在的方法,他的签名和接口里边定义的函数恰好一致,就可以直接传入方法引用。 因为parseIntNum接口定义的方法是int pass(String s),和Integer中的静态方法int parseInt(String s)相比,除了方法名外,方法参数一致,返回类型相同,这就是我们说的方法签名一致,可以直接传入方法引用
调用类的静态方法
此处小小中二了一点hhhh
class Naruto{
public static void Rasengan(){
System.out.println("螺旋丸");
}
}
//接口定义
interface Ninja{
//定义一个奥义方法
void aoyi();
}
public class methodQuote {
//通过引用Naurto的螺旋丸
Ninja ninja=Naruto::Rasengan;
//再发动奥义
ninjia.aoyi();
}
复制代码
public static void main(String[] args) {
//方式一
IntFunction<int []> arr1 = new IntFunction<int[]>() {
@Override
public int[] apply(int num) {
return new int[num];
}
};
arr1.apply(10);
//方式二(方法引用)
IntFunction<int []> arr2 = int[]::new;
arr2.apply(10);
}
复制代码
ArrayList<Integer> arrayList=new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
//匿名内部类
arrayList.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
System.out.println(integer);
}
});
//lambda优化
arrayList.forEach((integer)-> System.out.println(integer));
//方法引用打印,用方法引用替代了我们的匿名内部类(相当于替代了lambda)
arrayList.forEach(System.out::println);
复制代码
可以说那个参数,只是为方法体服务的,只是方法体里边会用到. 而我们都用了方法引用了,前提就是参数和返回值一样,方法体也是我们想要实现的内容,这时自然而然都不用我们写方法体了,那方法体所依赖的参数也自然不用派上用场了
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。