1.什么是Lambda表达式?
将函数式编程引⼊了
Java
。
Lambda
允许把函数作为⼀个⽅法的参数,或者把代码看成数据。
2.例如下面的代码,如果使用Lambda表达式是不是会简单一些??
@Data
@AllArgsConstructor
@ToString
@ApiModel(description = "手机sku")
public class MobilePhone {
@ApiModelProperty("主键id")
private Long id;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("价格")
private Double price;
@ApiModelProperty("品牌")
private String brand;
}
/***
* @author sqd
* @Date 2022-06-19
* */
@ApiModel("test")
public class test {
private static List<MobilePhone> mobilePhones = new ArrayList<MobilePhone>();
static {
mobilePhones.add(new MobilePhone(1L,"mate7",new Double(5000),"华为"));
mobilePhones.add(new MobilePhone(1L,"Pro7",new Double(6000),"荣耀"));
mobilePhones.add(new MobilePhone(2L,"11Pro",new Double(4000),"小米"));
mobilePhones.add(new MobilePhone(2L,"13Pro",new Double(5000),"小米"));
mobilePhones.add(new MobilePhone(3L,"12Pro",new Double(3000),"vivo"));
mobilePhones.add(new MobilePhone(4L,"Max12",new Double(2000),"魅族"));
}
}
现在进行筛选价格为5000的手机,和名为小米的手机
/**
* 价格筛选
*/
private static List<MobilePhone> selectForPrice(List<MobilePhone> mobilePhones){
List<MobilePhone> list = new ArrayList<MobilePhone>();
for (MobilePhone mobilePhone : mobilePhones){
if(mobilePhone.getPrice().equals(5000)){
list.add(mobilePhone);
}
}
return list;
}
/**
* 名称筛选
*/
private static List<MobilePhone> selectForName(List<MobilePhone> mobilePhones){
List<MobilePhone> list = new ArrayList<MobilePhone>();
for (MobilePhone mobilePhone : mobilePhones){
if (mobilePhone.getName().equals("小米")){
list.add(mobilePhone);
}
}
return list;
}
public static void main(String[] args){
/**
* 筛选价格为5000的手机
*/
List<MobilePhone> price = selectForPrice(mobilePhones);
for (MobilePhone prices: price){
System.out.println("价格为5000的手机为:"+prices);
}
/**
* 筛选名字为小米的手机
*/
List<MobilePhone> name = selectForName(mobilePhones);
for (MobilePhone names : name){
System.out.println("名字为小米的手机是:"+names);
}
}
按照我们正常的做法就是创建对象,遍历输出结果。这种做法是可行的,但是回头想我们并不是想创建一个对象,只是为了获取筛选结果不得不创建这个对象。为了让这个过程变得简单,这个时候就需要一种简便的方式--Lambda表达式。
3.Lambda语法图解
"->"被称为Lambda操作符或箭头操作符。
箭头左侧:指定了Lambda表达式需要的所有参数。
箭头右侧:指Lambda体,就是Lambda表达式要执行的任务、功能或者说行为。
如果不想了解他的原理直接使用看下图
4.函数式接口
函数式接口只要确保接口中有且仅有一个抽象方法,使用注解@FunctionalInterface定义。
修饰符 interface 接⼝名称 {
[public abstract] 返回值类型 ⽅法名称(可选参数信息);
// 其他
}
函数式接口的特征
可选类型声明:不需要声明参数类型,编译器可以统⼀识别参数值
可选的参数圆括号
()
:⼀个参数⽆需定义圆括号,但多个参数需要定义圆括号
()
可选的⼤括号
{}
:如果主体包含了⼀个语句,就不需要使⽤
{}
可选的返回关键字
return
:如果主体只有⼀个表达式返回值则可以省略
return
和
{}
public static void main(String[] args) {
List<String> list = Arrays.asList("a","c","b");
Map<String,String> map = new HashMap<>(){
{
this.put("⼿机","⼩⽶");
this.put("笔记本","苹果笔记本");
this.put("⿏标","罗技⿏标");
}
};
//1.可选类型声明:不需要声明参数类型,编译器可以统⼀识别参数值
list.forEach((String x)->System.out.println(x));
list.forEach((x)->System.out.println(x));
System.out.println("-------------------------");
//2.可选的参数圆括号():⼀个参数⽆需定义圆括号,但多个参数需要定义圆括号()
list.forEach((x)->System.out.println(x));
list.forEach(x->System.out.println(x));
map.forEach((x,y)->System.out.println(x+":" + y));
System.out.println("-------------------------");
//3.可选的⼤括号{}:如果主体包含了⼀个语句,就不需要使⽤{}
list.forEach(x->System.out.println(x));
list.forEach(x->{
System.out.println(x);
System.out.println(x);
});
System.out.println("-------------------------");
//4.可选的返回关键字return:如果主体只有⼀个表达式返回值则可以省略return和{}
list.stream().sorted((s1,s2)->s2.compareTo(s1)).forEach(x->System.out.println(x));
System.out.println("-------------------------");
}
注意
在某些情况下,类型信息可以帮助阅读者理解代码,这时需要⼿动声明类型,让代码便于阅读。有时省略类型信息
更加简洁明了,还可以减少⼲扰,让阅读者关注业务逻辑,这时就可以省略;所以在开发中建议⼤家根据⾃⼰或项
⽬组的习惯结合实际情况,进⾏类型声明或省略。