java8新特性-Lambda表达式

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("-------------------------");
 }
注意
在某些情况下,类型信息可以帮助阅读者理解代码,这时需要⼿动声明类型,让代码便于阅读。有时省略类型信息
更加简洁明了,还可以减少⼲扰,让阅读者关注业务逻辑,这时就可以省略;所以在开发中建议⼤家根据⾃⼰或项
⽬组的习惯结合实际情况,进⾏类型声明或省略。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值