title: Lambda表达式
index_img: https://picss.sunbangyan.cn/2023/07/30/stdtw2.jpg
tags:
- Java SE
categories:
- Java SE
excerpt: Lambda表达式
格式
- 不关心是谁调用方法,方法是什么,关心方法本身(参数和方法体)
- 只能用于函数式接口的匿名内部类
- 函数式接口:有且只有一个抽象方法的接口,接口上可以加上
@FunctionalInterface
注解
()->{
}
()
方法形参->
固定格式{}
方法体
- 参数类型可以不写
- 如果只有一个参数,参数类型和()都可以省略
- 如果方法体只有一行
- 是return,则return、{}、;都可以省略
- 不是return,则{}、;可以省略
案例1
public class Main {
public static void main(String[] args) {
Integer[] num = {1, 2, 5, 4, 3};
Arrays.sort(num, new Comparator<Integer>() {
@Override
public int compare(Integer t1, Integer t2) {
return t2 - t1;
}
});
System.out.println(Arrays.toString(num));//[5, 4, 3, 2, 1]
}
}
改进
- 去掉对象相关:
new Comparator<Integer>()
- 去掉方法名:
public int compare
- 保留参数和方法体,加上
->
- 去除参数类型
- 去除return、{}、;
public class Main {
public static void main(String[] args) {
Integer[] num = {1, 2, 5, 4, 3};
Arrays.sort(num, (t1, t2) -> t2 - t1);
System.out.println(Arrays.toString(num));//[5, 4, 3, 2, 1]
}
}
案例2
@FunctionalInterface
interface Swim {
public abstract void swimming(String name);
}
public class Main {
public static void main(String[] args) {
//这里匿名内部类实现了Swim接口(重写了抽象方法)
method(new Swim() {
@Override
public void swimming(String name) {
System.out.println(name + "游泳");
}
});
}
public static void method(Swim s) {//这里是接口多态,运行看右边
s.swimming("小鱼"); //小鱼游泳
}
}
改进
- 去掉
new Swim()
- 去掉
Swimming
- 保留参数和方法体
- 去除()和参数类型
- 去除{}、;
@FunctionalInterface
interface Swim {
public abstract void swimming(String name);
}
public class Main {
public static void main(String[] args) {
//这里匿名内部类实现了Swim接口(重写了抽象方法)
method(name -> System.out.println(name + "游泳"));
}
public static void method(Swim s) {//传入的参数是匿名内部类本身,并通过匿名内部类调用重写方法
s.swimming("小鱼"); //小鱼游泳
}
}