Java Lambda 表达式

举报
Yeats_Liao 发表于 2022/10/19 23:14:43 2022/10/19
【摘要】 一、说明Lambda表达式是什么Lambda 表达式也称为闭包,是Java 8 发布的新特性Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)为什么要使用Lambda表达式避免匿名内部类定义过多,可以让代码简洁紧凑,留下核心的逻辑 二、理解语法格式(parameters) -> expression[表达式](parameters) -> statements[语句](...

一、说明

Lambda表达式是什么

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

为什么要使用Lambda表达式

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

二、理解

语法格式

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

函数式接口

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

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

特征

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

三、演示

1.常规方法实现

正常情况下的实现加法函数计算,需要定义接口并实现类,再调用方法,在此基础上不断简化,去深入理解Lambda 表达式是如果做到的
在这里插入图片描述

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);
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。