Java中的Lambda表达式

繁杂的Runnable接口

实现多线程

//使用匿名内部类实现多线程
new Thread(new Runnable){
    @Override
    public void run(){
        System.out.println(Thread.currentThread().getName+"新线程创建了");
    }).start;
}

//使用Lambda表达式
new Thread(()->{
    	System.out.println(Thread.currentThread().getName+"新线程创建了");
	}
).start();

Lambda表达式的标准格式

由三部分组成:一些参数 一个箭头 一段代码
格式:
(参数列表)->{一些重写方法的代码};
解释说明格式:
():接口中抽象方法的参数列表,没有参数就空着;有参数就写出参数,多个参数用逗号分隔
->:传递的意思,把参数传递给方法体{}
{}:重写接口的抽象方法的方法体

1.无参数无返回值类型

//给定一个厨子Cook接口,内含唯一的抽象方法makeFood,且无参数,无返回值
//使用Lambda表达式调用foodCook()方法,打印输出“吃饭啦”字体

public interface Cook{
    public abstract void makeFood();
}

public class Demo{
    public static void main(String[] args){
        //之前的方式
        
        //调用方法,参数是Cook接口,传递该接口的匿名内部类对象
        foodCook(new Cook(){
            public void makeFood(){
                System.out.println("吃饭啦");
            }
        });
        
        //使用Lambda表达式
        //更能体现出不关注怎么实现的,传递的参数怎么样,只关注结果,目的是输出吃饭啦
        foodCook(()->{
            System.out.println("吃饭啦");
        });
    }
    
    public static void foodCook(Cook cook){
        cook.makeFood();
    }
}

2.有参数和返回值

/*使用数组存储多个Person对象,对数组中的对象使用Arrays的sort方法通过年龄进行升序排序*/

Person[] arr = {new Person("陈欢",18),new Person("樊萌萌",13),
				new Person("孙佳宁",15),new Person("姚梦含",14)};

//传统方式
Arrays.sort(arr,new Comparator<Person>(){
    public int compare(Person p1,Person p2){
        return p1.getAge()-p2.getAge();
    }
});

//使用表达式
Arrays.sort(arr,(Person p1,Person p2)->{
    return p1.getAge()-p2.getAge();
});

3.Lambda省略格式

可推导可省略

它强调的是做什么而不是怎么做,所以凡是可以根据上下文推导得知的信息,都可以省略

省略规则

在Lambda标准格式的基础上,使用省略写法的规则:
1.小括号内参数的类型可以省略
2.如果小括号内有且仅有一个参数,则小括号可以省略
3.如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号,但是要注意,要省略他们,必须三个一起省略
//例如:
foodCook(()->System.out.println("吃饭啦"));
//三个一起省略了
Arrays.sort(arr,(p1,p2)->p1.getAge()-p2.getAge());

4.使用时要注意的事项

1.使用Lambda必须要有接口,且接口中有且仅有一个抽象方法,无论是内置的Runnable、Comparator接口还是自定义接口,只有当接口中的抽象方法存在且唯一时,才可以使用
2.使用Lambda必须具有上下文推断。(只有一个接口才能推断表达式简化的是谁)方法的参数或局部变量类型必须是Lambda对应的接口类型,才能使用Lambda作为该接口的实例。
3.有且仅有一个抽象方法的接口,称为“函数式接口”。

你可能感兴趣的:(Java)