Java中lambda表达式的使用

   💕"我不要麻木的死去"💕

作者:Mylvzi 

 文章主要内容:Java中lambda表达式的使用 

 

一.背景

  lambda表达式是Java SE 8中一个重要的新特性,允许你使用一个表达式来代替功能接口。lambda表达式可以看作一个没有返回值,没有修饰符修饰的方法,它具有参数和这些参数的主体(方法体)Lambda 表达式(Lambda expression),基于数学中的λ演算得名,也可称为闭包(Closure)

二.语法

1.基本语法

  基本语法: (parameters) -> expression 或 (parameters) ->{ statements;

  1. parameters:类似于方法中的形参列表,参数来源于函数式接口的参数
  2. ->:可以理解为"被用于"
  3. expression :方法体  可以是一条语句也可以是多条语句

2.函数式接口

  函数式接口就是只含有一条抽象方法的接口

如果接口上声明了@FunctionalInterface,那么编译器就会按照函数式接口进行检验,也即此接口内部只能有一个抽象方法,但是可以使用default来添加一个非抽象方法

@FunctionalInterface
interface FuncInterface1 {void test();
}// 这样也是可以的
@FunctionalInterface
interface FuncInterface2 {void test();default void test2(){System.out.println("===");}
}

三.lambda表达式的基本使用

 lambda表达式就相当于使用一种更简单的方式重写了抽象方法(相比于使用匿名内部类)

1.无返回值,无参数

//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {void test();
}

使用两种方式实现

        // 使用lambda表达式重写函数式接口的抽象方法     参数       方法体NoParameterNoReturn noParameterNoReturn1 = () -> System.out.println("hello1");noParameterNoReturn1.test();// 输出hello1// 使用匿名内部类重写函数式接口的抽象方法NoParameterNoReturn noParameterNoReturn2 = new NoParameterNoReturn() {@Overridepublic void test() {System.out.println("hello2");}};

2.无返回值,一个参数

//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {void test(int a);
}

使用两种方式实现

        // 使用lambda表达式OneParameterNoReturn oneParameterNoReturn = (x) -> System.out.println(x);oneParameterNoReturn.test(10);// 打印10// 使用匿名内部类OneParameterNoReturn oneParameterNoReturn1 = new OneParameterNoReturn() {@Overridepublic void test(int a) {System.out.println(a);}};

注意:当参数只有一个或者方法体只有一句时,可以省略外面的(); 

3.无返回值多个参数 

//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {void test(int a,int b);
}

使用两种方式实现

        // 使用lambda表达式MoreParameterNoReturn moreParameterNoReturn = (x,y) -> System.out.println(x+y);moreParameterNoReturn.test(10,20);// 输出30// 使用匿名内部类MoreParameterNoReturn moreParameterNoReturn1 = new MoreParameterNoReturn() {@Overridepublic void test(int a, int b) {System.out.println(a+b);}};

4.有返回值无参数

//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {int test();
}

使用两种方式实现

        NoParameterReturn noParameterReturn = () -> {return 10;};System.out.println(noParameterReturn.test());// 输出10// 简化NoParameterReturn noParameterReturn1 = () ->10;System.out.println(noParameterReturn1.test());// 输出10// 使用匿名内部类NoParameterReturn noParameterReturn2 = new NoParameterReturn() {@Overridepublic int test() {return 10;}};

5.有返回值一个参数

//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {int test(int a);
}

使用两种方式实现

        OneParameterReturn oneParameterReturn = (x) -> {return x*x;};System.out.println(oneParameterReturn.test(10));// 输出100// 简化OneParameterReturn oneParameterReturn1 = x -> x*x;System.out.println(oneParameterReturn1.test(10));// 输出100// 使用匿名内部类OneParameterReturn oneParameterReturn2 = new OneParameterReturn() {@Overridepublic int test(int a) {return a*a;}};

6.有返回值多参数

@FunctionalInterface
interface MoreParameterReturn {int test(int a,int b);
}

使用两种方式实现

        MoreParameterReturn moreParameterReturn = (x,y) -> {return x+y;};System.out.println(moreParameterReturn.test(10, 20));// 输出30// 使用匿名内部类MoreParameterReturn moreParameterReturn1 = new MoreParameterReturn() {@Overridepublic int test(int a, int b) {return a+b;}};

四.在优先级队列中的使用

  优先级队列中往往涉及到比较,我们在实例化优先级队列的时候往往要传递一个比较器,规定比较的对象

        // 使用匿名内部类实现Comparator接口PriorityQueue<Integer> priorityQueue = new PriorityQueue(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return  o2 - o1;}});

 其实也能看出,Comparator方法应该是一个函数式接口,它属于"多个参数,有返回值"的类型(对应于上面的最后一种情况),此处就可以使用lambda表达式进行语法上的精简

        // 使用lambda表达式实现优先级队列中的比较PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((o1,o2) ->{return o1-o2;});

Comparator的源码 -->多个参数,有返回值的接口

五.创建线程

 创建线程的方式有很多种,可以采用匿名内部类,lambda表达式

1.匿名内部类创建线程

        // 创建线程 ->使用匿名内部类Thread thread1 = new Thread() {@Overridepublic void run() {System.out.println("hello thread");}};// 这种方式可以降低耦合性(推荐)Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("hello thread2");}});

为什么可以使用匿名内部类创建一个线程呢?主要是因为Thread类实现了Runnable接口,这个接口是一个函数式接口,只有一个抽象方法run()

 

2.使用lambda表达式

  既然Thread可以通过匿名内部类方式创建线程,同时就可以使用lambda表达式来简化创建

        // 方式1Thread thread1 = new Thread(() ->{System.out.println("hello thread1");});thread1.run();// 输出hello thread1//方式2  利用lambda表达式实例化一个runnable接口  降低耦合性Runnable runnable = () -> System.out.println("hello thread2");Thread thread2 = new Thread(runnable);thread2.run();// 输出hello thread2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/255542.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux | tar,bc,uname指令

Linux | tar&#xff0c;bc&#xff0c; 文章目录 Linux | tar&#xff0c;bc&#xff0c;tar指令【重要】bc指令uname –r指令 tar指令【重要】 tar [-cxtzjvf] 文件与目录 … 参数&#xff1a; -c &#xff1a;建立一个压缩文件的参数指令(create 的意思)&#xff1b;-x &am…

某60区块链安全之薅羊毛攻击实战一学习记录

区块链安全 文章目录 区块链安全薅羊毛攻击实战一实验目的实验环境实验工具实验原理实验内容薅羊毛攻击实战一 实验步骤EXP利用 薅羊毛攻击实战一 实验目的 学会使用python3的web3模块 学会分析以太坊智能合约薅羊毛攻击漏洞 找到合约漏洞进行分析并形成利用 实验环境 Ubun…

SQL Server权限管理与数据恢复

SQL Server的安全机制 SOL Server 的安全性是建立在认证和访问许可两种安全机制之上的&#xff0c;其中&#xff0c;认证用来确定登录 SQlL Server 的用户的登录账户和密码是否正确&#xff0c;以此来验证其是否具有连接 SQL. Server的权限&#xff1a;访 问许可用来授予用户或…

SpringSecurity(五)

深入理解HttpSecurity的设计 一、HttpSecurity的应用 在前章节的介绍中我们讲解了基于配置文件的使用方式&#xff0c;也就是如下的使用。 也就是在配置文件中通过 security:http 等标签来定义了认证需要的相关信息&#xff0c;但是在SpringBoot项目中&#xff0c;我们慢慢脱离…

SpringBoot3.x代码生成器构建的三层架构主启动类报错

【场景复现】 jdk21环境变量springboot3.x、mybatisplus generator3.5.3构建工程启动&#xff1a; 【原因分析】 显示 factoryBeanObjectType 属性的值类型不正确&#xff0c;应该是一个实现了 FactoryBean 接口的类的全限定名。 注解注入每层对象&#xff0c;找不到Factory…

目标检测——SPPNet算法解读

论文&#xff1a;Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 作者&#xff1a;Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun 链接&#xff1a;https://arxiv.org/abs/1406.4729 目录 1、算法概述2、Deep Networks with Spatia…

交叉验证以及scikit-learn实现

交叉验证 交叉验证既可以解决数据集的数据量不够大问题&#xff0c;也可以解决参数调优的问题。 主要有三种方式&#xff1a; 简单交叉验证&#xff08;HoldOut检验&#xff09;、k折交叉验证&#xff08;k-fold交叉验证&#xff09;、自助法。 本文仅针对k折交叉验证做详细解…

uniapp实战 —— 猜你喜欢(含滚动触底分页加载)

效果预览 组件封装 src\components\SUI_Guess.vue <script setup lang"ts"> import { ref, onMounted } from vue import type { GuessItem } from /types/index import { getGuessListAPI } from /apis/index import type { PageParams } from /types/global…

生态学、种间关系、进化

这里写自定义目录标题 参考资料种间关系Lynn Margulis共生体在进化过程中形成了一种互帮互助的机制 捕食&#xff1a;收割理论 进化思想史 参考资料 普通生态学(孙儒泳)高等教育出版社1998普通生态学(尚玉昌)北京大学出版社2010《生态学》&#xff08;面向21世纪教材&#xff…

《opencv实用探索·十三》opencv之canny边缘检测

1、canny边缘检测应用场景 目标检测&#xff1a; Canny边缘检测可以用于检测图像中的目标边缘&#xff0c;从而帮助识别和定位物体。在目标检测的流程中&#xff0c;边缘通常是检测的第一步。 图像分割&#xff1a; Canny边缘检测可用于图像分割&#xff0c;即将图像划分为具有…

数据分析基础之《matplotlib(4)—柱状图》

一、柱状图绘制 1、柱状图要素 有类别 2、需求&#xff1a;对比每部电影的票房收入 电影数据如下图所示&#xff1a; 3、matplotlib.pyplot.bar(x, height, width0.8, bottomNone, *, aligncenter, dataNone, **kwargs) 说明&#xff1a; x&#xff1a;有几个类别 height&am…

基于JavaSE+JDBC使用控制台操作的简易购物系统【源码+数据库】

1、项目简介 本项目是一套基于JavaSEJDBC使用控制台操作的简易购物系统&#xff0c;主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目可以直接作为bishe使用。 项目都经过严格调试&…