【Java笔记】(二):Lambda表达式

函数式编程思想

函数是有输入,有输出的额一个过程,面向对象思想强调的是一切必须通过对象的形式来做事情,

函数式思想则尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式去做,

lambda表达式就是函数式编程思想的体现

在这里插入图片描述

Lambda初体验

需求:启动一个线程,输出一句话

public class Test {
    
    
    public static void main(String[] args) {
    
    
        //实现类的方式
        //MyRunnable myRunnable = new MyRunnable();
        //Thread t = new Thread(myRunnable);
        //t.start()
        
        //匿名内部类的方式
        new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                System.out.println("多线程启动啦!");
            }
        }).start();
        
        //lambda方式改造
        new Thread( ()-> {
    
    
            System.out.println("多线程启动啦!");
        }).start();
    }
}

lambda方式分析:

  • ()里面没内容,可以看作方法形参为空
  • ->用箭头指向后面要做的事
  • { }包含一段代码,称之为代码块,可以看成方法体中的内容

Lambda表达式标准格式

格式:(形参)->{代码块}

如果有多个形参就用逗号分开,没有为空即可

Lambda表达式使用前提

  • 有一个接口
  • 接口中有且只有一个抽象方法

Lambda表达式练习

Addable是一个接口,其中有add这个方法,执行完控制台输出了30,

执行lambda表达式的时候,系统偷偷的自动创建了一个对象,lambda实现了add方法

lambda表达式的结果其实就是一个实现了接口的对象,这也解释了传的参数应该是Addable的实现对象

public class Test {
    
    
    public static void main(String[] args) {
    
    
        useAddable( (int x,int y)-> {
    
    
            return x+y;
        });
    }
    private static void useAddable(Addable a) {
    
    //传的肯定是Addable的实现对象,所以可以调用
        int sum = a.add(10,20);
        System.out.println(sum);
    }
}

省略模式

  • 参数类型可以省略,但是不能只省略一个,要省略全省略
  • 如果参数有且仅有一个,小括号可以省略
  • 如果代码块的语句只有一条,可以省略大括号和分号,如果有return也要把return省略

Lambda表达式与匿名内部类的区别

# 所需类型不同
	匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
	Lambda表达式:只能是接口
# 使用限制不同
	如果接口中有且仅有一个抽象方法,可以使用lambda表达式,也可以使用匿名内部类
	如果接口有多个抽象方法,只能使用匿名内部类,不能使用lambda表达式
# 实现原理不同
	匿名内部类:编译以后产生一个单独的.class字节码文件
	Lambda表达式:编译之后没有一个单独的.class字节码文件,对应的字节码会在运行时动态生成

猜你喜欢

转载自blog.csdn.net/m0_46521785/article/details/114660184