怎么理解Java中的lambda表达式

Lambda概述

Lambda表达式是JDK8开始后的一种新语法形式

作用: 简化匿名内部类的代码写法

格式: 

 

rust

代码解读

复制代码

(匿名内部类被重写方法的形参列表)->{     被重写方法的方法体代码 } 注:->是语法形式,无实际意义

首先我们先定义一个抽象类,通过匿名内部类重写其方法,再对其进行简化,比较二者之间有何变化:

使用Lambda表达式之前: 

 

csharp

代码解读

复制代码

public static void main (String[] args){     People p = new People(){     @Override     public void run(){         System.out.println("小学生跑的很慢");         }     };     p.run();     } abstract class People{     public abstract void run(); }

使用Lambda表达式之后:

 

ini

代码解读

复制代码

People p = ()->{     System.out.println("小学生跑的很慢"); }; //会出现报错

会出现报错,这是为什么呢?原因在于前面对于Lambda表达式的定义并不清晰,Lambda表达式并不能简化所有匿名内部类,其只能简化函数式接口匿名内部类的写法形式,且接口中有且仅有一个抽象方法,通常,我们会再接口上加上一个@Functionalinterface注解,标记该接口必须是满足函数式接口。

真正意义上通过Lambda表达式简化: 

 

csharp

代码解读

复制代码

@FunctionalInterface//加上这个注解必须是函数式接口,且只有一个抽象方法 interface People{     void run(); } //简化之前的匿名内部类 People p = new People(){     @Override     public void run(){         System.out.println("小学生跑的很慢!");     } }; //简化之后 People p = () -> {         System.out.println("小学生跑的很慢!"); };

另外,也可以将其作为参数代入方法中去使用:

 

scss

代码解读

复制代码

//在原来的基础上定义一个pk方法 public static void pk(People p){     System.out.println("跑步情况如何:")     p.run(); } //不使用Lambda的情况下: pk(p);//需要在定义匿名内部类之后,将p代入; //使用Lambda的情况: People p = () -> {         System.out.println("小学生跑的很慢!"); }; pk(() -> {         System.out.println("小学生跑的很慢!"); }); //由于等号右边即是People创建的对象p,因此可以可以直接将其代入

Lambda的好处:

 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,它可以写出更简洁、更灵活的代码,作为一种更紧凑的代码风格,使Java语言表达能力得到了提升。

Lambda实战的作用 

在之前的学习过程中,我们学习过了Arrays的相关知识,其中有一个sort方法(可以将数组升序或降序排列),它其实也是接口类,并且只有一个抽象方法:

 

sql

代码解读

复制代码

//精简之前: Arrays.sort(grade,new Comparator<Integer>(){     @Override     public int compare(Integer o1,Integer o2){         return o2 -o1; } }); //精简之后: Arrays.sort(grade,(Integer o1,Integer o2) -> {         return o2 -o1; });

Lambda表达式省略规则 

  • 参数类型可以省略不写
 

kotlin

代码解读

复制代码

//参考前面的实战例子 Arrays.sort(grade,(Integer o1,Integer o2) -> {         return o2 -o1; }); //省略参数类型之后 Arrays.sort(grade,( o1, o2){         return o2 -o1; });

  • 如果只有一个参数,参数类型可以省略,同时()也可以省略
 

csharp

代码解读

复制代码

//简单引用一个单个参数的例子,不需要了解其具体含义 btn.addActionListener((ActionEvent e) -> {     System.out.println("我是简单的例子。"); }); //简化之后: btn.addActionListener( e -> {     System.out.println("我是简单的例子。"); });

  • 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号
 

csharp

代码解读

复制代码

//参照上一条规则的例子 btn.addActionListener( e -> {     System.out.println("我是简单的例子。"); }); //简化之后: btn.addActionListener( e -> System.out.println("我是简单的例子。") );

  • 如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写
 

rust

代码解读

复制代码

//参照第一条规则的代码 Arrays.sort(grade,(Integer o1,Integer o2) -> {         return o2 -o1; }); //简化之后: Arrays.sort(grade,( o1, o2)-> o2 -o1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值