Java拉姆达表达式

2023-05-16

目录

语法

lambda表达式的重要特征

 变量作用域


Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑。

语法

lambda 表达式的语法格式如下:

(parameters) -> expression
或
 (parameters) ->{ statements; }

lambda表达式的重要特征

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。

 Lambda 表达式实例

Lambda 表达式的简单例子:

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 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)

示例代码:

public class Java8Tester {
   public static void main(String args[]){
      Java8Tester tester = new Java8Tester();
        
      // 类型声明
      MathOperation addition = (int a, int b) -> a + b;
        
      // 不用类型声明
      MathOperation subtraction = (a, b) -> a - b;
        
      // 大括号中的返回语句
      MathOperation multiplication = (int a, int b) -> { return a * b; };
        
      // 没有大括号及返回语句
      MathOperation division = (int a, int b) -> a / b;
        
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
        
      // 不用括号
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);
        
      // 用括号
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);
        
      greetService1.sayMessage("Runoob");
      greetService2.sayMessage("Google");
   }
    
   interface MathOperation {
      int operation(int a, int b);
   }
    
   interface GreetingService {
      void sayMessage(String message);
   }
    
   private int operate(int a, int b, MathOperation mathOperation){
      return mathOperation.operation(a, b);
   }
}

 结果为:

$ javac Java8Tester.java 
$ java Java8Tester
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Runoob
Hello Google

使用 Lambda 表达式需要注意以下两点:

  • Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
  • Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

 变量作用域

lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。

在 Java8Tester.java 文件输入以下代码:

public class Java8Tester {
 
   final static String salutation = "Hello! ";
   
   public static void main(String args[]){
      GreetingService greetService1 = message -> 
      System.out.println(salutation + message);
      greetService1.sayMessage("Runoob");
   }
    
   interface GreetingService {
      void sayMessage(String message);
   }
}

结果为:

$ javac Java8Tester.java 
$ java Java8Tester
Hello! Runoob

我们也可以直接在 lambda 表达式中访问外层的局部变量:

public class Java8Tester {
    public static void main(String args[]) {
        final int num = 1;
        Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
        s.convert(2);  // 输出结果为 3
    }
 
    public interface Converter<T1, T2> {
        void convert(int i);
    }
}

lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)

int num = 1;  
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
s.convert(2);
num = 5;  
//报错信息:Local variable num defined in an enclosing scope must be final or effectively 
 final

在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。

String first = "";  
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length());  //编译会出错 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java拉姆达表达式 的相关文章

  • Netbeans 8.1 Gnome 3 GTK+ UI 字体和选项卡高度

    我刚刚在运行 GNOME 3 桌面的 Ubuntu 16 04 上安装了 NetBeans 8 1 如果可能的话 我想继续使用 IDE 的 GTK 外观和感觉 但 UI 上的字体 尤其是选项卡中的字体 太小且重叠 我尝试添加 fontsiz
  • 使用 Tabula 通过 Python 读取 pdf 时出现 Java 错误

    我已经安装了 tabula 库 用于使用 python 将 pdf 读取到 pandas 数据框中 但是当我运行代码时 import tabula df tabula read pdf sample1 pdf pages 1 我得到了例外
  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • 如何在java中将数组值排序为循环格式?

    我的数组值如下 String value 1 2 3 4 5 6 7 8 9 10 假设如果我将值 5 传递给 tat 数组 它应该按如下顺序排序 5 6 7 8 9 10 1 2 3 4 怎么办 有人帮忙吗 感谢你 你需要的就是所谓的轮换
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • 如何在 JPQL 或 HQL 中进行限制查询?

    在 Hibernate 3 中 有没有办法在 HQL 中执行相当于以下 MySQL 限制的操作 select from a table order by a table column desc limit 0 20 如果可能的话 我不想使用
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 如何在 Spring 中使 @PropertyResource 优先于任何其他 application.properties ?

    我正在尝试在类路径之外添加外部配置属性资源 它应该覆盖任何现有的属性 但以下方法不起作用 SpringBootApplication PropertySource d app properties public class MyClass
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 如何在java中将日期格式从YYMMDD更改为YYYY-MM-DD? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我从机器可读代码中获取日期格式为 YYMMDD 如何将其更改为 YYYY MM DD 例如我收到 871223 YYMMDD 我想把它改成
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐

  • break和continue的区别

    1 一般的continue会退回最内层循环的开头 xff08 并继续执行 xff09 2 带标签的continue会到达标签的位置 xff0c 并重新进入紧接在那个标签后面的循环 3 一般的break会中断并跳出当前循环 4 带标签的bre
  • samba服务常用命令

    sudo vim etc samba smb conf 里增添用户 span class token punctuation span bsp span class token punctuation span comment span c
  • 用mac进行图片的自由裁剪

    用mac上自带的图片预览工具 xff0c 即可完成对图片的自由裁剪
  • WEB项目部署到Linux下无法访问html、css、js等静态文件的解决

    WEB项目 xff0c 在自己本机 xff08 windows xff09 下通过Tomcat访问 一切正常 部署到Linux下的Tomcat 进行访问 除了 do接口和jsp页面能访问外 其他的都不能访问 原因 xff1a 默认80端口
  • Java规范的三种注释方式

    在学习开发中药养成良好的编码习惯 xff0c 规整的代码格式会为程序日后的维护工作提供便利 在此对编码规则做了以下总结 xff1a 1 每条语句尽量单独占一行 xff0c 每条语句都要以分号结束 xff1b 2 在声明变量时 xff0c 尽
  • Tensorflow2.5安装(安装问题,这一篇全解决)

    恭喜你发现全网最简单最详细的Tensorflow安装教程 xff01 本文将给出2 5版本的具体配置 xff0c 若要安装其他版本也可参照本文的思路 与过去版本对比 xff0c 你可以感受到来自Tensorflow2 5的善意 xff1a
  • linux嵌入式arm基础笔记5之录音与播放

    1 粤嵌GEC6818开发板介绍 http www gec lab com arm show 72 html 2 粤嵌GEC6818平台介绍及其开发板配置 操作系统 心若十年的博客 CSDN博客 https blog csdn net qq
  • C++应用之线程池ThreadPool

    include 34 ThreadPool h 34 include 34 StopWatch h 34 include lt thread gt include lt chrono gt include lt iostream gt vo
  • Centeros最小化安装后很多常用命令无法使用(一键安装linux常用命令)

    运行如下命令立即解决问题 最小化安装系统后还会有一些基本的工具没装 xff0c 可采用yum方式批量安装 xff0c 也可以使用哪个安装哪个 yum y install wget setuptool system config firewa
  • 【从零开始的SDN学习之路】之闲话Neutron与SDN的联系

    闲话Neutron与SDN的联系 前言一 OpenStack中的网络发展二 Neutron是不是SDN xff1f 前言 OpenStack作为当前最富盛名的云计算管理工具 xff0c 其服务覆盖了网络 虚拟化 操作系统 服务器等各个方面
  • ESP8266(ESP模块)Arduino开发环境快速搭建方法--含网盘离线文件

    目录 1 ESP8266简介 1 1 乐鑫ESP8266 1 2 安信可ESP模组 2 ESP8266开发 3 开发环境搭建 4 网盘文件离线安装 1 ESP8266简介 1 1 乐鑫ESP8266 乐鑫公司的提供的ESP8266 系列模组
  • 解决Ubuntu虚拟机地无法上网问题

    虚拟机软件 xff1a VMware xff0c 操作系统 xff1a Ubuntu20 04 1 笔者安装好Unbutu20 04 1的虚拟机之后一直遇到一个问题 xff0c 网络图标不显示 xff0c 网络也不可用 每次都要把 虚拟网络
  • python中wraps的详解

    1 name 用来显示函数的名称 xff0c doc 用来显示文档字符串也就是 34 34 文档字符串 34 34 这里面的内容 2 首先我们来看不加 64 wraps的例子 span class token keyword def spa
  • 读书笔记-深度学习推荐系统1-概述章节

    推荐系统充斥于互联网的各个角落 xff0c 听音乐 看视频 看新闻 购物 学习课程等等 1 1 推荐系统的作用 用户 xff1a 在信息过载的情况下 xff0c 帮助用户高效获得感兴趣的信息 公司 xff1a 通过推荐吸引用户留存 增加用户
  • C++算法之——常用算法总结

    基本的C 43 43 算法分为三类 xff1a 排序算法 树算法 图算法 算法思想有三种 xff1a 递推 分治 动态规划 以及 贪心算法 本文将简要介绍上面三类算法 xff0c 介绍时穿插介绍算法思想 一 排序算法 1 基本O n 2 排
  • xfs 文件系统的备份和恢复(包含磁盘挂载)

    一 xfs文件系统备份简介 XFS 提供了 xfsdump 和 xfsrestore 工具协助备份 XFS 文件系统中的数据 xfsdump 按 inode顺序备份一个 XFS 文件系统 centos7 开始选择 xfs 格式作为默认文件系
  • 正则的基本用法

    一 了解正则表达式 正则表达式是对字符串操作的一种逻辑公式 xff0c 就是用事先定义好的一些特定字符 及这些特定字符的组合 xff0c 组成一个 规则字符串 xff0c 这个 规则字符串 用来表达对字符串的一种过滤逻辑 正则表达式是用来匹
  • windows10 配置 VNC server

    windows10 配置 VNC server 配置 VNC server并设置 当客户端连接vnc server端时不能通过键盘和鼠标控制服务端 下载windows版 https www realvnc com en connect do
  • 二叉树的前序,中序,后序遍历

    前序遍历 xff1a 根节点 gt 左子树 gt 右子树 xff08 根 gt 左 gt 右 xff09 中序遍历 xff1a 左子树 gt 根节点 gt 右子树 xff08 左 gt 根 gt 右 xff09 后序遍历 xff1a 左子树
  • Java拉姆达表达式

    目录 语法 lambda表达式的重要特征 变量作用域 Lambda 表达式 xff0c 也可称为闭包 xff0c 它是推动 Java 8 发布的最重要新特性 Lambda 允许把函数作为一个方法的参数 xff08 函数作为参数传递进方法中