Java学习之Lambda表达式的使用详解

 更新时间:2022年12月26日 08:51:35   作者:从未止步..  
Lambda表达式是Java SE 8中一个重要的新特性,允许通过表达式来代替功能接口。本文将通过一些简单的示例和大家讲讲Lamda表达式的使用,感兴趣的可以了解一下

Lamda表达式

λ希腊字母表中排序第11位的字母,英文名称为Lambda,它Lambda表达式是Java SE 8中一个重要的新特性,允许通过表达式来代替功能接口,它与其他方法相同,提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块),实际上是属于函数式编程的概念:

语法如下:

(参数) ->表达式 或 (参数) ->{ 语句; }

Lambda表达式允许你直接把一个代码块赋值给一个变量

无参有返回值Lambda表达式:

() -> 2    //该Lambda表达式表示返回值为2

有参有返回值Lambda表达式:

一个参数:

x -> 2 * x    //x为参数,返回2*x的值

2个参数:

(x, y) -> x + y    //x,y均为参数,返回两者的和

有参无返回值Lambda表达式:

(String s) -> System.out.print(s)    //s为参数,将其输出

为什么要使用lambda表达式?

  • 避免匿名内部类定义过多
  • 可以让代码看起来很简洁
  • 去掉了大量没有意义的代码,只留下核心的逻辑

在讲如何使用Lamda表达式之前,我们先来学习一下FunctionalInterface (函数式接口)

函数式接口

任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口,对于函数式接口,我们可以通过lambda表达式来创建该接口的对象

举例:

//定义函数式接口
interface mylike{
    void lambda();
}

JDK1.8新特性,default默认方法可以有具体的实现:

//定义函数式接口
interface mylike{
        void lambda();
        default void test2() {
            System.out.println("我是default默认方法可以有具体的实现");
        }
    }

Lambda表达式的推导

定义函数式接口:

package Lambda;

public interface fun_interface {
    void show();
}

匿名函数的语法:

new 接口/类名(参数1, 参数2...){
        实现方法1(){

        }
        实现方法2(){

        }
        ......
 };

匿名函数的方法是:返回值 方法名 参数列表 方法体,我们只需要关心参数列表 方法体,而不用关心方法名和返回值

使用匿名内部类实现该函数式接口:

package Lambda;

public class fun_test1 {
    public static void main(String[] args) {
        fun_interface fun_interface=new fun_interface()
        {
                @Override
                public void show() {
                    System.out.println("重写函数式接口中的方法");
                }
            };
        fun_interface.show();
    }
}

在上述代码中,我们没有创建实现类[fun_test1]的实例化对象就实现了具体的show()方法,通常,我们也习惯用匿名内部类的方式创建并启动线程

但是上面的代码还是略显麻烦

Lambda表达式的写法:

package Lambda;
public class lambda_test {
    public static void main(String[] args) {
        fun_interface fun_interface=()->System.out.println("重写函数式接口中的方法");
        fun_interface.show();
    }
}

无论是匿名内部类还是Lambda表达式都可以正确实现这个接口,但使用匿名内部类,我们会发现在代码量上减少了许多,但其实Lambda表达式的本质就是一个匿名内部类

使用Lambda表达式的前提是:接口为函数式接口

函数式接口的不同类型

package Lambda;

public class fun_test3 {
    //无返回值无参数
    interface NoParameterNoReturn {
        void test();
    }
    //无返回值一个参数
    interface OneParameterNoReturn {
        void test(int a);
    }
    //无返回值多个参数
    interface MoreParameterNoReturn {
        void test(int a,int b);
    }
    //有返回值无参数
    interface NoParameterReturn {
        int test();
    }
    //有返回值一个参数
    interface OneParameterReturn {
        int test(int a);
    }
    //有返回值多参数
    interface MoreParameterReturn {
        int test(int a,int b);
    }

​​​​​​​}

Lambda表达式与函数式接口的简单应用

package Lambda;

public class fun_lambda {
    public static void main(String[] args) {
        //无返回值无参数
        NoParameterNoReturn parameterNoReturn=()-> System.out.println("这里是重写后的方法");
        parameterNoReturn.test();

        //无返回值一个参数
        //写法1
        OneParameterNoReturn oneParameterNoReturn=(a)->{System.out.println(a);};
        oneParameterNoReturn.test(99);
        //写法2
        OneParameterNoReturn oneParameterNoReturn1=a->System.out.println(a);
        //只有一个参数,小括号可以省略;只有一条语句,花括号可以省略
        oneParameterNoReturn1.test(99);

        //无返回值多个参数
        MoreParameterNoReturn moreParameterNoReturn=(a,b)->{System.out.println(a+b);};
        moreParameterNoReturn.test(99,1);


        //有返回值无参数
        NoParameterReturn noParameterReturn=()->{return  520;};
        int ret=noParameterReturn.test();
        System.out.println(ret);

        //有返回值一个参数
        OneParameterReturn oneParameterReturn=(a)->{return a+1;};
        int ret1=oneParameterReturn.test(99);
        System.out.println(ret1);

        //有返回值多参数
        MoreParameterReturn moreParameterReturn=(a,b)->a*b;//相当于(a+b)->{return a*b;}
        int ret2=moreParameterReturn.test(4,8);
        System.out.println(ret2);
    }
}
interface NoParameterNoReturn {
    void test();
}
//无返回值一个参数
interface OneParameterNoReturn {
    void test(int a);
}
//无返回值多个参数
interface MoreParameterNoReturn {
    void test(int a,int b);
}
//有返回值无参数
interface NoParameterReturn {
    int test();
}
//有返回值一个参数
interface OneParameterReturn {
    int test(int a);
}
//有返回值多参数
interface MoreParameterReturn {
    int test(int a,int b);
}

输出:

这里是重写后的方法
99
99
100
520
100
32

注:

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

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

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

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

Lambda表达式的优缺点

优点:

  • 在代码层次上来说,使代码变得非常的简洁,开发迅速
  • 方便函数式编程
  • 非常容易进行并行计算
  • Java 引入 Lambda,改善了集合操作

缺点:

  • 代码可读性变差
  • 在非并行计算中,很多计算未必有传统的 for 性能要高
  • 不容易进行调

以上就是Java学习之Lambda表达式的使用详解的详细内容,更多关于Java Lambda表达式的资料请关注脚本之家其它相关文章!

相关文章

  • Java Mybatis框架由浅入深全解析上篇

    Java Mybatis框架由浅入深全解析上篇

    MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码本文将为大家初步的介绍一下MyBatis的使用
    2022-07-07
  • 解决无法解析javax.servlet的方法

    解决无法解析javax.servlet的方法

    最近在创建一个servlet时,自动生成的代码中出现servlet无法解析的提示,令我无法正常使用servlet里的方法,在对各个步骤进行查看后,发现了问题所在,需要的朋友可以参考下
    2021-05-05
  • SpringBoot整合H2数据库的操作方法

    SpringBoot整合H2数据库的操作方法

    H2是一个Java语言编写的嵌入式数据库,它不受平台的限制,同时H2提供了一个十分方便的web控制台,用于操作和管理数据库内容,本文介绍SpringBoot整合H2数据库的方法,感兴趣的朋友一起看看吧
    2024-01-01
  • 学习java编程后可以走哪些职业道路

    学习java编程后可以走哪些职业道路

    在本篇文章里给大家介绍了关于学习java后的职业道路,以及需要学习的相关知识内容,有兴趣的朋友们可以跟着学习下。
    2022-11-11
  • Java多线程中的Phaser使用解析

    Java多线程中的Phaser使用解析

    这篇文章主要介绍了Java多线程中的Phaser使用解析,java多线程技术提供了Phaser工具类,Phaser表示“阶段器”,用来解决控制多个线程分阶段共同完成任务的情景问题,其作用相比CountDownLatch和CyclicBarrier更加灵活,需要的朋友可以参考下
    2023-11-11
  • 解析和解决org.springframework.beans.factory.NoSuchBeanDefinitionException异常问题

    解析和解决org.springframework.beans.factory.NoSuchBeanDefinitionE

    这篇文章主要介绍了解析和解决org.springframework.beans.factory.NoSuchBeanDefinitionException异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java 实现跨平台的操作方式

    Java 实现跨平台的操作方式

    这篇文章主要介绍了Java 实现跨平台的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • springboot整合redis之消息队列

    springboot整合redis之消息队列

    本文主要介绍了springboot整合redis之消息队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Spring JPA配置文件Eclipse报错如何解决

    Spring JPA配置文件Eclipse报错如何解决

    这篇文章主要介绍了Spring JPA配置文件Eclipse报错如何解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Spark学习笔记之Spark SQL的具体使用

    Spark学习笔记之Spark SQL的具体使用

    这篇文章主要介绍了Spark学习笔记之Spark SQL的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06

最新评论