Java-Lambda表达式

引入

Lambda表达式是在JAVA 8 中引入的,初衷是进一步简化匿名类的语法(匿名类还需要在类中实现函数),并使JAVA走向函数式编程。

语法

(parameters) -> expression

或

(parameters) -> { statements; }

  1. 可选类型声明。不需要声明参数类型
  2. 可选参数圆括号。
  3. 可选大括号。
  4. 可选返回关键字

例子

简单例子

java 复制代码
// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x -- y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

分别使用匿名类和Lambda表达式创建一个线程并打印字符串:

java 复制代码
public class ThreadTest {
    //使用匿名类
    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("hello");
        }
    });
    
    //使用lambda表达式
    Thread t1 = new Thread(() -> System.out.println("hello1"));
}

明显lambda表达式比匿名函数要简洁

如何匹配Java的类型系统

函数式编程

函数式接口是一种只有单一抽象方法的接口 ,使用@FunctionalInterface注释来描述,其可以隐式转换成Lambda表达式。使用Lambda表达式来实现函数式接口,不需要提供类名和方法定义,就可以通过一行代码提供函数式接口的实例。

java.util.function包中定义了各种函数式接口。Supplier接口是其中用于提供数据的接口。其定义如下

利用Lambda表达式或方法引用,可以得到接口的实例:

java 复制代码
Supplier stringSupplier = () -> "ok";
System.out.println(stringSupplier.get());
   
Supplier stringSupplier1 = String::new; //返回空字符串

定义自己的函数式接口

java 复制代码
@FunctionalInterface
public interface MathOperation {
    int operation(int a, int b);
}


public class MathOperationTest {
    //实现了该接口的函数
    MathOperation addition = (a, b) -> a + b;

}

Lambda表达式让复用代码更方便:可以把一大段逻辑中变化的部分抽象出函数式接口,由外部方法提供函数实现,重用方法内的逻辑处理。

注意点

变量作用域

  1. lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。(或者该局部变量在后续不被修改,即隐式具备fina语义)
  2. 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量
相关推荐
Pniubi13 分钟前
HashMap的扩容和树化边界
java·开发语言
Mikko729 分钟前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师30 分钟前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.1 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼2 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
gCode Teacher 格码致知2 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工2 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留2 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
ShineWinsu2 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说3 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json