JAVA中的lambda表达式(无废话)

devtools/2024/12/22 1:32:55/

Lambda表达式是Java SE 8中一个重要的新特性

它是一种语法形式,可以代码书写更加精炼。

用人话说就是把原来的代码变得很短。

这部分的内容是非常简单的。

一、函数式接口

想要理解lambda表达式,首先要了解函数式接口。

关于接口的知识请查阅:抽象类与接口

定义:

1.如果一个接口中只有一个抽象方法,那么就是一个函数式接口。

2.在这个函数式接口的上声明@FunctionalInterface那么编译器将会自动为你检查,这个接口是否是函数式接口,如果不是编译器将会报错!

示例一:

示例二:

二、lambda表达式的语法和使用

在不用类去实现这些接口的情况下,需要使用到匿名类去重写接口中的抽象方法(test()方法),就是代码看上去有点长:

这是我们就可以使用lambda表达式去简化这个代码。

如果还没有学习匿名类的同学,可以先去学习一下,相当于是一个前置知识:四种内部类的详细介绍

lambda表达式语法:

要重写方法的参数)->{要重写方法的方法体};

以上面的

NoParameterNoReturn

为例:

对比上一块代码是不是简单了很多呢?

对于有一个参数,没有返回值的情况

使用传统的匿名类写法:

使用lambda表达式后:

实际上还可以更简化:

还可以在简化!:

如果是有返回值的方法,其实写法也是一样的,

以两个参数,有返回值的这个接口为例:

传统使用匿名内部类写法:

lambda简化的写法:

实际上对于有返回值的方法,还可以这样写:


这种简化代码的写法,除了用到函数式接口,还可以运用到JAVA中的一些接口当中

下面举几个例子,就明白啦。

PriorityQueue<T>接口:

我们直到,PriorityQueue默认创建的是小根堆,如果要创建一个大根堆,需要从写传入的参数中的compare方法:

很想我们刚才的函数时接口八,这是我们也可以使用lambda表达式,进行简化:

这样就让代码变得非常的简洁。

List接口:

假设我们定义这样一个顺序表,储存字符串,对这些字符串的长度进行排序

lambda简化:

运行结果:

当然如果想要在这些java自己的接口中使用lambda表达式,你要对接口中原来的方法了如指掌,这是前提


另外,lambda表达式不经可以简写代码,还可以进行

变量捕获

什么时变量捕获,举个例子就明白了:

运行结果:

但是,如果我们在lambda表达式中,去更改变量s的值编译器将会报错:

翻译过来就是:

lambda表达式使用的外部变量(也就是表达式外面所定义的变量),要么是:

final修饰的常变量。

要么是:

从定义后到生命周期结束时就从来没有改变过的变量!

否则编译器报错!

有些人可能很鸡贼,在lambda表达式后面对变量进行更改,实际上编译器也是会发现de:

这就是lambd表达式的变量捕获。



http://www.ppmy.cn/devtools/35534.html

相关文章

深入了解C/C++的内存区域划分

&#x1f525;个人主页&#xff1a;北辰水墨 &#x1f525;专栏&#xff1a;C学习仓 本节我们来讲解C/C的内存区域划分&#xff0c;文末会附加一道题目来检验成果&#xff08;有参考答案&#xff09; 一、大体有哪些区域&#xff1f;分别存放什么变量开辟的空间&#xff1f; …

牛客NC320 装箱问题【中等 动态规划,背包问题 C++/Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/d195a735f05b46cf8f210c4ad250681c 几乎完全相同的题目&#xff1a; https://www.lintcode.com/problem/92/description 思路 动态规划都是递归递推而来。php答案是动态规划版本&#xff0c;递归版本有 测试用…

【Linux网络】网络文件共享

目录 一、存储类型 二、FTP文件传输协议 2.1 FTP工作原理 2.2 FTP用户类型 2.3 FTP软件使用 2.3.1 服务端软件vsftpd 2.3.2 客户端软件ftp 2.4 FTP的应用 2.4.1 修改端口号 2.4.2 匿名用户的权限 2.4.3 传输速率 三、NFS 3.1 工作原理 3.2 NFS软件介绍 3.3 NFS配…

Leetcode编程练习

面试题-消失的数字 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start 1;end - 1;}}void rotate(vector<int>& …

揭秘“全民拼购”:小众模式如何引爆商业新纪元

在当今商业领域&#xff0c;一个曾经被边缘化&#xff0c;但实则蕴含巨大价值的商业模式逐渐崭露头角。不同于传统的销售模式&#xff0c;这一新模式在我近期接触的一个案例中表现出了惊人的活力&#xff0c;即便在用户数量不足二十万的情况下&#xff0c;也能实现日均销售额接…

AWS详细介绍与GCP比较

AWS&#xff08;Amazon Web Services&#xff09;详细介绍 Amazon Web Services (AWS) 是亚马逊公司的云服务平台&#xff0c;提供广泛的全球云基础设施服务。自2006年推出以来&#xff0c;AWS已发展成为市场上最大、最广泛使用的云服务提供商之一&#xff0c;提供超过200种功…

微博视频怎么下载无水印

在当今社交媒体时代&#xff0c;微博已经成为人们获取信息、分享生活的重要平台之一。许多人在浏览微博时常常遇到一个问题&#xff1a;如何下载微博视频而不留下烦人的水印呢?今天&#xff0c;我将分享一些神秘的方法&#xff0c;让你轻松解锁微博视频的无水印下载技巧。 第…

基于TL431和CSA的恒压与负压输出

Hello uu们,51去那里玩了呀?该收心回来上班了,嘿嘿! 为什么会有这个命题,因为我的手头只有这些东西如何去实现呢?让我们一起来看电路图吧.电路图如下图1所示 图1:CSA恒压输出电路 图1中,R1给U2提供偏置,Q1给R1提供电流,当U1-VOUT输出大于2.5V时候,U2内部的三极管CE导通,使得…