Java Lambda 表达式

Java Lambda 表达式JavaLambda 表达式

一、说明

Lambda表达式是什么

  • Lambda 表达式也称为闭包,是Java 8 发布的新特性
  • Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)

为什么要使用Lambda表达式

  • 避免匿名内部类定义过多,可以让代码简洁紧凑,留下核心的逻辑

二、理解

语法格式

(parameters) -> expression[表达式] (parameters) -> statements[语句] (parameters) ->{ 
    statements; } 

函数式接口

Functional lnterface(函数式接口)是指任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口,可以通过Lambda表达式创建该接口的对象

public interface Runnable { 
    public abstract void run(); } 

特征

  • 可省略类型声明:不需要声明形式参数类型
  • 可省略参数括号:一个参数无需定义括号,但多个参数需要定义括号
  • 可省略花括号:如果主体只包含了一个语句就不需要使用花括号
  • 可省略返回关键字:如果主体只包含了一个返回值语句则会自动返回

三、演示

1.常规方法实现

public class LambdaDemo { 
    public static void main(String[] args) { 
    //3.执行计算 MathOperation addition = new Addition(); addition.operation(1,2); } } //1.定义一个函数式接口方法 interface MathOperation{ 
    void operation(int a, int b); } //2.定义实现类 class Addition implements MathOperation{ 
    @Override public void operation(int a, int b) { 
    System.out.println(a + b); } } 

2.静态内部类

进一步改进使得代码更紧凑,实现静态内部类,也就是将实现类放入主类中,会提示我们需要定义静态类

在这里插入图片描述
在这里插入图片描述

public class LambdaDemo { 
    //2.实现静态内部类 static class Addition implements MathOperation{ 
    @Override public void operation(int a, int b) { 
    System.out.println(a + b); } } public static void main(String[] args) { 
    //3.执行计算 MathOperation addition = new Addition(); addition.operation(1,2); } } //1.定义一个函数式接口 interface MathOperation{ 
    void operation(int a, int b); } 

3.局部内部类

可是静态内部类还是太繁琐了,如果把它放进方法里面呢?由此引出局部内部类,即在一个方法中定义的内部类,这时就不用定义静态类了

在这里插入图片描述

public class LambdaDemo { 
    public static void main(String[] args) { 
    //2.实现局部内部类 class Addition implements MathOperation{ 
    @Override public void operation(int a, int b) { 
    System.out.println(a + b); } } //3.执行计算 MathOperation addition = new Addition(); addition.operation(1,2); } } //1.定义一个函数式接口 interface MathOperation{ 
    void operation(int a, int b); } 

4.匿名内部类

局部内部类还是感觉代码太多了,如果简化呢?比如把类名隐藏?匿名内部类就是没有名字的内部类,其必须实现接口或抽象父类的所有抽象方法

在这里插入图片描述

public class LambdaDemo { 
    public static void main(String[] args) { 
    //2.实现匿名内部类,实现接口,直接执行计算 new MathOperation(){ 
    @Override public void operation(int a, int b) { 
    System.out.println(a + b); } }.operation(1, 2); } } //1.定义一个函数式接口 interface MathOperation{ 
    void operation(int a, int b); } 

在这里插入图片描述

public class LambdaDemo { 
    public static void main(String[] args) { 
    //2.实现匿名内部类,实现接口 MathOperation addition = new MathOperation() { 
    @Override public void operation(int a, int b) { 
    System.out.println(a + b); } }; //3.执行计算 addition.operation(1,2); } } //1.定义一个函数式接口 interface MathOperation{ 
    void operation(int a, int b); } 

5.Lambda表达式

都已经没有类名了,能否再简化呢?用Lambda试试,因为接口中只有一个方法,方法中只有一块语句,因此可以省略接口和方法,只留下语句实现

在这里插入图片描述

public class LambdaDemo { 
    public static void main(String[] args) { 
    //2.Lambda简化,只有一块语句,省略接口和方法,只留下语句实现 MathOperation addition = (int a , int b) -> { 
    System.out.println(a + b); }; //3.执行计算 addition.operation(1, 2); } } //1.定义一个函数式接口 interface MathOperation{ 
    void operation(int a, int b); } 

6.Lambda再简化

Lambda 表达式还可以省略参数类型,因为一行语句,因此可以省略花括号

在这里插入图片描述

public class LambdaDemo { 
    public static void main(String[] args) { 
    //2.Lambda简化,省略参数类型,代码块只有一句,可以省略花括号 MathOperation addition = (a , b) -> System.out.println(a + b); //3.执行计算 addition.operation(1,2); } } //1.定义一个函数式接口 interface MathOperation{ 
    void operation(int a, int b); } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214945.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午3:04
下一篇 2026年3月18日 下午3:04


相关推荐

  • SSM的简介

    SSM的简介SSM的简介

    2022年4月22日
    50
  • BeanCopier工具类_BeanUtils

    BeanCopier工具类_BeanUtilscglib的BeanCopier功能很强大,不过频繁的create太占用资源,降低服务器性能,所以写了下面的代码进行优化。以达到提升性能的目的。主要就是用缓存将类型相同的copier缓存起来,后续copy的时候就不用再继续创建了。这样的话如果有频繁用到BeanCopier的地方,将是很有用处滴。importorg.springframework.cglib.beans.BeanCopi…

    2025年9月15日
    9
  • 三道计算时间复杂度的题目

    三道计算时间复杂度的题目出处 算法第四版 EditionSedge 著 问题 1 4 7 三道小题初看觉得很简单 但是仔细一分析 a b 小题里面的内循环操作次数是和外层的 n i 值有关 并不是简单的操作 N 次 很久没有算过时间复杂度了 稍微感到有点棘手 publicstatic intN intsum 0 for intn N n gt 0 n 2 for inti 0 i lt

    2026年3月16日
    2
  • java向文件中写入内容,字节流,字符流,缓冲,复制文件,设置字符编码 实例

    java向文件中写入内容,字节流,字符流,缓冲,复制文件,设置字符编码 实例

    2021年7月18日
    58
  • Linux命令之压缩zip

    Linux命令之压缩zipzip 命令的功能是用于压缩文件 解压命令为 unzip 压缩后不覆盖源文件 可以压缩目录

    2026年3月26日
    2
  • Parcelable与Serializable

    Parcelable与Serializable优点 缺点 google 官方也是很贴心呀 直接把怎么用放在源码的注释里了优点 缺点 Serializable 是一个空接口 用来标识当前类可以被 ObjectOutput 序列化 以及被 ObjectInputS 反序列化总结 Java 应用程序中有 Serializable 来实现序列化操作 Android 中有 Parcelable 来实现序列化操作在 Android 中除了对数据持久化的时候需要使用到 Serializable 来实现序列化操作 其他的时候我们仍然需要使用 Parcelab

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号