首页 > 其他分享 >lambda表达式

lambda表达式

时间:2024-03-13 15:32:19浏览次数:21  
标签:函数 int MathOperation 接口 表达式 lambda

本文章将简要介绍java中lambda的基本知识和使用


一.lambda的构成

lambda表达式的语法结构相对简单,主要由以下几个部分组成:

  1. lambda关键字: lambda关键字用于标识这是一个lambda表达式,表示即将定义一个匿名函数。
  2. 参数列表: 参数列表即用括号括起来的形式参数,可以包含零个或多个参数,多个参数之间使用逗号进行分隔。
  3. 冒号: 冒号用于分隔参数列表和lambda表达式的执行逻辑。
  4. 表达式主体: 表达式主体定义了lambda表达式的执行逻辑,通常为一个表达式,用于计算返回结果。

lambda表达式的一般形式如下:

lambda arguments: expression

我们现在简单演示一下:

// 1. 不需要参数,返回值为 2
() -> 2
// 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表达式的前提

只能包含一个抽象方法接口被称为函数式接口。这个抽象方法定义了接口的行为,其他非抽象方法(默认方法、静态方法)不影响接口的函数式特性。

//@FunctionalInterface是函数式接口的标志
@FunctionalInterface
interface MathOperation{
    int operation(int a,int b);
}

三.lambda表达式的实现

有了函数式接口后,我们就可以用这个接口实现lambda表达式了

//@FunctionalInterface是函数式接口的标志
@FunctionalInterface
interface MathOperation{
    int operation(int a,int b);
}
public class Lambda {
    public static void main(String[] args) {

        //实现加法函数
        MathOperation add=(a,b)->a+b;

        //实现减法函数
        MathOperation sub=(a,b)->a-b;

        //实现乘法函数
        MathOperation mul=(a,b)->a*b;

        //实现除法函数
        MathOperation div=(a,b)->a/b;

        //结果展示
        System.out.print(add.operation(3,5));
        System.out.print(sub.operation(3,5));
        System.out.print(mul.operation(3,5));
        System.out.print(div.operation(3,5));
    }

}

8 -2 15 0

Lambda可以理解为:Lambda就是匿名内部类的简化,实际上是创建了一个类,实现了接口,重写了接口的方法

        //匿名内部类的实现方法
        MathOperation add2=new MathOperation() {
            @Override
            public int operation(int a, int b) {
                return a+b;
            }
        };
        System.out.println(add2.operation(3,5));

代码精简:

1. 参数类型可以省略,如果需要省略,每个参数的类型都要省略。

2. 参数的小括号里面只有一个参数,那么小括号可以省略

3. 如果方法体当中只有一句代码,那么大括号可以省略

4. 如果方法体中只有一条语句,且是return语句,那么大括号可以省略,且去掉return关键字。

四.变量捕获

我们之前说到lambda就是匿名内部类的简化,我们知道内部类是可以使用外部类的变量,这被称为变量捕获,同理,lambda也存在变量捕获

我们先看看内部类的变量捕获,代码如下:

//创建好的函数式接口
@FunctionalInterface
interface Fun{
    void test();
}

class Test_lambda{
    public static void main(String[] args) {
        //外部变量a
        int a=100;
        
        //这是我们创建好的匿名内部类,它在Test_lambda的内部且没有名字,只是实现了Fun接口
        new Fun(){
            @Override
            public void test() {
                //捕获到了外部变量a
                System.out.println(a);
            }
        };
    }
}

注意:在上述代码当中的变量a就是捕获的变量。这个变量要么是被final修饰,如果不是被final修饰的,你要保证在使用之前没有修改。不然就会报错

现在来看看lambda的变量捕获

//创建好的函数式接口
@FunctionalInterface
interface Fun{
    void test();
}

class Test_lambda{
    public static void main(String[] args) {
        //外部变量a
        int a=100;

        //这是我们创建好的lambda表达式
        Fun fun=()->{
            System.out.println("这是捕捉到的变量a:"+a);
        };

    }

}

五.总结

Lambda表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。

优点:

1. 代码简洁,开发迅速

2. 方便函数式编程

3. 非常容易进行并行计算

4. Java 引入 Lambda,改善了集合操作

缺点:

1. 代码可读性变差

2. 在非并行计算中,很多计算未必有传统的 for 性能要高

3. 不容易进行调试


到这里,我们的lambda表达式就简单说明完了

标签:函数,int,MathOperation,接口,表达式,lambda
From: https://blog.csdn.net/a1806542392/article/details/136623680

相关文章

  • 开源.NET 全能 Cron 表达式解析库(支持 Cron 所有特性)
    前言今天大姚给大家分享一个.NET全能Cron表达式解析类库,支持Cron所有特性:TimeCrontab。Cron表达式介绍Cron表达式是一种用于配置定时任务的时间表达式。它由一系列字段组成,每个字段代表任务在不同时间维度的调度规则。Cron表达式常用于各种系统中,如操作系统的定时任务、......
  • 07-Lambda表达式
    泛型泛型(Generics)是JDK1.5版本增加的技术,他可以帮助我们建立类型安全的集合。在使用了泛型的集合中,不必进行强制类型转换。JDK提供了支持泛型的编译器,将运行时的类型检查提前到了编译时执行,使代码可读性和安全性更高。不使用泛型:publicstaticvoidmain(String[]args){......
  • 实验1 C语言开发环境使用和数据类型、运算符、表达式
    1#include<stdio.h>2intmain()3{4printf("o\n");5printf("<H>\n");6printf("II\n");78return0;9}#include<stdio.h>intmain(){printf("oo\n"......
  • 实验1 C语言开发环境使用和数据类型、运算符、表达式
    task1点击查看代码#include<stdio.h>intmain(){printf("o\n"); printf("<H>\n"); printf("II\n"); printf("o\n"); printf("<H>\n"); printf("II\n"); system("......
  • MYSQL: 表表达式(CTE)实现递归实例
    环境:MYSQL8.0 + windows10 1、在TEST数据库中创建 表CTE_TEST.CREATETABLE`test`.`cte_test`(test_idINT,test_nameVARCHAR(50),parent_test_idINT,created_byINT,creation_dateTIMESTAMP);例子数据:INSERTINTO`test`.`cte_test`(test_i......
  • 正则表达式
    .匹配除换行符以外的任意字符。^匹配字符串的开头。$匹配字符串的结尾。*匹配前一个字符零次或多次。+匹配前一个字符一次或多次。?匹配前一个字符零次或一次。非贪婪匹配,只要后面的满足就停止{n}匹配前一个字符恰好n次。{n,}匹配前一个字符至少n次。{n,m}......
  • 在v-model中无法使用表达式的解决方法
    当我们想要使用复杂一点逻辑来决定具体使用哪个属性时,就会遇到v-model本身只支持简单的数据属性,并不支持表达式。有两种方法可以满足:1、使用计算属性+getter\setter<divid="demo">姓:<inputtype="text"placeholder="firstName"v-model="firstName"><br>......
  • C语言判断表达式的写法3<keyDown && keyDown<14
    if(3<keyDown&&keyDown<14){//Yourcodehere}可以写成if(3<keyDown<14){//Yourcodehere}吗答案:不能,因为在C语言中,if(3<keyDown&&keyDown<14) 和 if(3<keyDown<14) 是不同的。在C语言中,3<keyDown......
  • 规则七:避免css表达式
    当页面动态变化时,对于各种事件,例如改变大小,滚动和鼠标移动。这些都会发送请求进行求值,这样就导致了求值进行的非常繁琐。如何避免:使用一次性表达式:将值设置成为固定值,去除css表达式使用事件处理器:这样可以避免在无关事件发生时对表达式的求值。  ......
  • [蓝桥杯 2019 省 B] 后缀表达式
    这题没想到怎么贪心,看题解恍然大明白#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;typedeflonglongLL;constintN=2e5+5;LLans;in......