ubuntu安装jdk语句_JDK 12:实际中的切换语句/表达式

ubuntu安装jdk语句

我的上一篇文章“ 玩JDK 12的Switch表达式 ”讨论了使用JDK 12 Early Access Builds尝试JEP 325 switch 表达式语句的过程,并提供了一个简单的示例。 这篇文章使用相同的JDK 12 Early Access Build 10来演示switch表达式和增强的switch语句的不同功能。

我在博客文章“ 通过引入switch表达式来增强Java switch语句 ”中使用了2×2网格,以说明新的“箭头”语法(“ switch标为规则”)可以与switch 语句switch表达式一起使用。按照JEP325。同样,按照JEP 325,传统的“冒号”语法(“带开关标记的语句组”)也可以与switch 表达式switch语句一起使用。 换句话说,结肠的存在( :并不一定意味着一个switch的“箭头”的声明 ,并存在( ->并不一定意味着一个switch 表达 。 为了方便起见,我在前面的文章中提供了表格的改编版本。

声明
(“交换机的非本地控制流_out_ [继续到封闭循环,带有标签的中断,返回]”)
表达
(总计:返回一个值)
开关标签声明组
(“结肠”)
(启用穿透)
switch我们知道和“爱”,但增强了 break返回的值类似于return
开关标签规则
(“箭头”)
(防止掉线)
语句/冒号的“语法简写”(上)以及
  • “消除了“休息”的烦恼”
  • “隐式防止所有形式的失败”
  • “避免了电流开关范围的混乱”
箭头( -> )指向返回值

使用JDK 12 Early Access Build ,可以方便地试用新的switch 表达式 ,我们还可以试用switch 语句的传统版本和增强版本。

传统开关声明

即使启用了JDK 12预览( --enable-preview ),我们“知道并爱着”的传统switch 语句仍然可用。 接下来显示此传统 switch语句的示例,即使启用了JDK 12语言功能预览,该示例也可以成功编译和执行。

/*** Demonstrate traditional switch statement assigned to* local variable.*/
public static void demonstrateTraditionalSwitchStatement()
{out.println("Traditional Switch Statement:");final int integer = 3;String numericString;switch (integer){case 1 :numericString = "one";break;case 2 :numericString = "two";break;case 3:numericString = "three";break;default:numericString = "N/A";}out.println("\t" + integer + " ==> " + numericString);
}

这篇文章中显示的这个代码以及所有其他代码示例都可以在GitHub上找到 。 这个特定的示例显示了传统switch语句设置局部变量值的常见用法。 我有意选择了该用例,因为新的switch表达式是实现此目的的一种改进方法。

增强型开关声明

如前所述,我们可以在增强的 switch 语句中使用新的“箭头”语法(“带有开关标签的规则”)。 在使用--enalved-preview的JDK 12 Early Access Build 10上编译并运行的下一个代码示例中显示了这一点。

/*** Demonstrate enhanced switch statement used to assign* a local variable.*/
public static void demonstrateEnhancedSwitchStatement()
{out.println("Enhanced Switch Statement:");final int integer = 2;String numericString;switch (integer){case 1 -> numericString = "one";case 2 -> numericString = "two";case 3 -> numericString = "three";default -> numericString = "N/A";}out.println("\t" + integer + " ==> " + numericString);
}

最后一个示例显示了该switch仍然用作语句 ,但是在这种情况下,它利用了“箭头”语法(“标签规则”)来完成其切换,而没有明确指定break 。 这不仅是更少的代码,而且更重要的是,它的优点是不允许经常令人恐惧的switch “掉线”。 简而言之, 增强后的 switch 语句的工作方式类似于当前/传统的switch语句,但是没有传统版本的潜在缺陷。

新开关表达式通过中断返回值

JEP 325除了增强当前的switch语句以允许指定switch语句而没有掉线的风险之外,还引入了在switch 表达式中使用switch关键字的概念。 Java教程的“ 表达式,语句和块 ”页面介绍了语句操作之间的区别。 为了便于讨论,该教程中的两个重要观察结果是(我加粗体 ):

  1. 表达式是由变量,运算符和方法调用组成的结构, 其结果为单个值 。”
  2. “ Java编程语言允许您从各种较小的表达式构造复合表达式 ,只要该表达式的一部分所需的数据类型与另一部分的数据类型匹配即可。”

下一个代码清单演示了如何使用JDK 12 Early Access Build 10和--enable-preview替换上面显示的使用switch 语句将一个值分配给一个较早声明的局部变量的代码,该代码使用一个switch 表达式以在单个语句中将其结果值分配给局部变量。

/*** Demonstrate switch expression using colons and breaks.*/
public static void demonstrateSwitchExpressionWithBreaks()
{final int integer = 1;out.println("Switch Expression with Colons/Breaks:");final String numericString =switch (integer){case 1 :break "uno";case 2 :break "dos";case 3 :break "tres";default :break "N/A";};out.println("\t" + integer + " ==> " + numericString);
}

刚刚显示的代码示例演示了switch 表达式的使用,该表达式与前面显示的传统switch语句示例非常相似。 但是,有几个显着差异。 区别在于此switch表达式返回的结果分配给局部变量“ numericString ”。 第二个区别直接与switch 表达式能够返回值有关,在于break子句现在每个都具有要在break关键字之后立即指定的相关case要返回的值。 本质上, switch 表达式break就像Java方法return

通过标签规则的新开关表达式返回值

只是示出的实施例表明,人们可以从一个返回值switch有类似结肠表达式: )和break语法什么一个很可能与使用switch的语句。 除了熟悉之外,此方法的另一个优点是可以在返回单个值之前为单个case指定多个语句。 但是,在大多数情况下,使用前面讨论的“箭头”语法从switch 表达式返回值可能会变得很流行,因为它不会遭受掉线的风险并避免了通常与传统switch语句相关的范围意外。 下一个代码清单展示了新的switch 表达式如何使用“标签规则”(“ arrow”语法)而不是冒号和break以优雅地返回switch的单个解析值。

/*** Demonstrate switch expressions using "arrow" syntax.*/
public static void demonstrateSwitchExpressionWithArrows()
{final int integer = 4;out.println("Switch Expression with Arrows:");final String numericString =switch (integer){case 1 -> "uno";case 2 -> "dos";case 3 -> "tres";case 4 -> "quatro";default -> "N/A";};out.println("\t" + integer + " ==> " + numericString);
}

上面的四个示例演示了2×2网格中所示的每种情况。 本文的其余部分将讨论通过使用JDK 12 Early Access Build 10尝试switch表达式和语句而获得的一些其他观察结果。

可以为单个情况指定多个常量

2×2网格中的四个象限中的任何一个都允许将多个常数与单个case相关联。 在下面的代码清单中对此进行了演示,该清单在启用“预览语言功能”的情况下与JDK 12 Early Access Build 10一起编译和运行。

/*** Demonstrate that multiple constants can be associated with* a single {@code case} and used in conjunction with a* {@code switch} expression that uses the "arrow" syntax.*/
public static void demonstrateLabelRulesWithSharedCases()
{final int integer = 7;out.println("Multiple Case Labels:");final String numericString =switch (integer){case 0 -> "zero";case 1, 3, 5, 7, 9 -> "odd";case 2, 4, 6, 8, 10 -> "even";default -> "N/A";};out.println("\t" + integer + " ==> " + numericString);
}/*** Demonstrate that multiple constants can be associated with* a single {@code case} and used in conjunction with a* {@code switch} statement that uses the traditional colon and* {@code break} syntax.*/
public static void demonstrateBlockedStatementsWithSharedCases()
{final int integer = 6;out.println("Multiple Case Labels:");String numericString;switch (integer){case 0:numericString = "zero";break;case 1, 3, 5, 7, 9:numericString = "odd";break;case 2, 4, 6, 8, 10:numericString = "even";break;default:numericString = "N/A";};out.println("\t" + integer + " ==> " + numericString);
}

不能混用“箭头”(“标签规则”)和冒号/中断(“语句组”)

JDK 12 Early Access Build 10编译器( javac )不允许混合使用“箭头”语法和传统的冒号/ break语法。 尝试将这些混合使用会导致错误消息:“ 错误:开关中使用了不同种类的信息 ”。 接下来将显示一个示例代码,该示例将无法编译并显示此特定错误消息。

/*** WARNING - This does NOT compile, even with JDK 12 Early* Access Builds and --enable-preview because JEP 325 does* not allow the "arrow" syntax to be mixed with the* traditional colon/break syntax.*/
public static void demonstrateMixed()
{final int integer = 3;String numericString;switch(integer){case 1 :numericString = "one";break;case 2 -> numericString = "two";default -> numericString = "N/A";}return numericString;
}

Switch语句的中断无法返回值

新的switch 表达式返回一个值,当switch表达式使用冒号和break方法时,将在break关键字之后立即指定该返回值。 因为传统的switch 语句不返回值,所以尝试使与switch 语句关联的break指定返回值是编译时错误。 错误(“错误:意外的值中断”)可以用以下代码重现。

/*** WARNING - This does NOT compile, even with JDK 12 Early* Access Builds and --enable-preview because it is* nonsensical to have a "statement" return a value; that* is what an expression should be used for.*/
public static void demonstrateSwitchStatementReturnedLabel()
{final int integer = 4;switch (integer){case 1:break "one";case 2:break "two";case 3:break "three";default:break "N/A";};
}

当尝试使用带有指定标志--enable-preview-release 12 JDK 12 Early Access Build 10的javac编译器来编译以上代码时,错误消息“ error:意料之外 ”的四个实例(对应于三种case加上一种default价值突破 ”可见。 毫不奇怪,只需将此switch分配给局部变量(并有效地将语句转换为表达式 )的简单更改就可以编译此代码。 换句话说,将上面的代码更改为下一个代码清单中的代码可以使其编译并成功运行。

/*** This demonstrates that a {@code switch} "expression" is* able to (and expected to) provide the "return" value for* a given {@code case} and {@code default} instead of being* a compiler error as it was for the "statement" example* demonstrated in method* {@link #demonstrateSwitchStatementReturnedLabel()}.*/
public static void demonstrateSwitchExpressReturnedLabel()
{final int integer = 4;final String numericString =switch (integer){case 1:break "one";case 2:break "two";case 3:break "three";default:break "N/A";};
}

当前的JEP 325文本包含有关此break行为与方法return相似的讨论。 该讨论指出, switch 语句在其break s之后不需要返回值的情况类似于返回void的方法。 switch 表达式应返回非void值。

Switch语句的“箭头”语法必须指向一条语句

即使向javac编译器提供了--enable-preview-release 12 ,以下代码也无法在JDK 12 Early Access Build 10中进行编译。

/*** WARNING - This does not compile, even with JDK 12 Early* Access Builds and --enable-preview and reports error message* "error: not a statement" because it is expecting a* {@code switch} "statement" but what is being provided to each* {@code case} is NOT a statement.*/
public static void demonstrateSwitchStatementReturnedValueViaLabelRule()
{final int integer = 5;switch (integer){case 1 -> "one";case 2 -> "two";};out.println(numericString);
}

上面的代码无法编译,并且报告的错误消息是“错误:不是语句”。 这是因为在此示例中将switch用作语句,但是“箭头”语法是“指向”文字字符串而不是有效的Java语句。

所有可能性都必须在switch表达式中指定

因为switch 表达式需要返回一个非void值,所以switch 表达式必须为其可能打开的所有可能值指定case 。 实际上,这很可能是通过default来实现的,以捕获未用case明确指定的所有可能性。 使用传统的switch语句,不需要确保所有可能打开的值都由casedefault值覆盖,并且有时会导致某些情况,例如我在博客文章“ Log Unexpected Switch Options ”中所述。

以下代码违反了以下规则: switch 表达式必须指定casedefault值的所有可能值:

/*** WARNING - This method will not compile even with JDK 12* Early Access Build 10 with --enable-preview because of* error; "the switch expression does not cover all possible* input values".*/
public static void demonstrateLackingCaseInSwitchExpression()
{final int integer = 5;String numericString =switch (integer){case 1 -> "one";case 2 -> "two";};out.println(numericString);
}

刚刚显示的代码将无法编译,并且因果错误消息为“错误:开关表达式未涵盖所有可能的输入值。”

JEP 325对交换机未来使用的影响

考虑到Java中除了switch 语句之外还有可用的switch 表达式所带来的可能性,并考虑到可以与switch表达式或语句一起使用的新“箭头”语法所提供的优势,开始思考何时进行是很有趣的。上面2×2网格中的每个象限最有利。 总的来说,我相信我会发现自己经常使用带有“箭头”语法(“标签规则”)的switch 表达式 ,同时也经常使用带有“ arrow”语法的增强型switch 语句 。 我怀疑将来我会很少使用传统的:break )语法。 即使在特定case有多个语句要执行时,我也可能会将这些语句分解为单个方法,在这种case使用“箭头”语法进行调用。 这将使我受益于更明显的作用域并避免掉线的风险。 鉴于现在可以为单个case指定多个常量,即使在多个案例导致相同结果的情况下,也不再需要穿透。

其他资源

  • JEP 325:开关表达式(预览)
  • JEP 325规范:开关表达式
  • JDK 12抢先体验版
  • 运行中的JDK语言功能预览:切换表达式
  • 玩JDK 12的Switch表达式
  • 通过引入switch表达式来增强Java switch语句
  • 切换表达式到Java吗?
  • 切换表达式-收集线程
  • LJC演讲的少量反馈
  • GitHub上的帖子示例

翻译自: https://www.javacodegeeks.com/2018/09/jdk-12-switch-statements-expressions.html

ubuntu安装jdk语句

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

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

相关文章

SpringBoot JPA

一、创建步骤 二、目录结构 三、application.properties配置datasource spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver spring.datasource.usernameroot spring.datasource.passwordroot spring.datasource.urljdbc:mysql://localhost/springboot?userUnicod…

Linux 命令之 userdel -- 用于删除给定的用户以及与用户相关的文件

文章目录命令简介常用选项参考示例删除用户命令简介 userdel 命令用于删除指定的用户及与该用户相关的文件,英文全称即“user delete”。在 Debian 上,我们通常会使用 deluser 命令。 其实 userdel 命令实际上是修改了系统的用户账号文件 /etc/passwd、…

RestTemplate入门案例

一、创建步骤注意事项 二、目录结构 三、RestTemplateApplication层 package com.william;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; …

java 示例_功能Java示例 第5部分–将I / O移到外部

java 示例这是称为“ Functional Java by Example”的系列文章的第5部分。 在上一部分中,我们停止了对文档的变异,并返回了数据的副本。 现在,我们需要移走一些I / O。 如果您是第一次来,最好是从头开始阅读。 它有助于了解我们…

Linux 命令之 groupdel -- 删除指定的用户组

命令介绍 groupdel 命令用于删除指定的工作组,本命令要修改的系统文件包括 /ect/group 和 /ect/gshadow。若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。 参考示例 删除指定用户组 删除 linuxcool 工作组: …

模拟微服务业务场景

一、创建步骤 模拟开发过程中的服务间关系。抽象出来,开发中的微服务之间的关系是生产者和消费者关系。 总目标:模拟一个最简单的服务调用场景,场景中保护微服务提供者(Producer)和微服务调用者(Consumer),方便后面使用微服务架…

Linux 命令之 groupmod -- 更改群组识别码或名称

文章目录命令介绍常用选项参考示例命令介绍 groupmod 命令用于更改群组的识别码或名称时。不过大家还是要注意,用户名不要随意修改,组名和 GID 也不要随意修改,因为非常容易导致管理员逻辑混乱。如果非要修改用户名或组名,则建议…

cassandra使用心得_使用Spring Data Cassandra缓存的预备语句

cassandra使用心得今天,我有一篇简短的文章,内容涉及在Spring Data Cassandra中使用Prepared Statements。 Spring为您提供了一些实用程序,使您可以更轻松地使用“预备语句”,而不是依靠自己使用Datastax Java驱动程序手动注册查询…

注册中心 Spring Cloud Eureka

一、搭建eureka-server工程 目录结构 二、导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

Linux 用户(user)和用户组(group)管理概述

文章目录一、理解Linux的单用户多任务&#xff0c;多用户多任务概念二、用户(user&#xff09;和用户组&#xff08;group&#xff09;概念三、用户&#xff08;user&#xff09;和用户组&#xff08;group&#xff09;相关的配置文件、命令或目录一、理解Linux的单用户多任务&…

mockito java_Java:使用Mockito模拟ResultSet

mockito java这篇文章展示了如何使用Mockito模拟java.sql.ResultSet 。 它可用于帮助对ResultSet进行操作的单元测试代码&#xff08;例如ResultSetExtractor &#xff09;而无需依赖外部数据源。 您可以通过提供列名列表和2D数据数组来创建MockResultSet 。 例如&#xff1a;…

服务中心Eureka

一、服务消费者-注册服务中心 测试结果 二、消费者通过Eureka访问提供者 测试结果 Consumer ConsumerController package com.william.controller;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance;…

Linux 命令之 newgrp -- 登入另一个群组

文章目录命令介绍常用选项参考示例切换登录用户组命令介绍 newgrp 命令的英文全称为“new group”&#xff0c;使用该命令指定用户组名称&#xff0c;执行命令后&#xff0c;其实是以相同的用户名&#xff0c;但是以另一个群组名称&#xff0c;再次登入系统。所以本质上是切换…

pivotal_Spring Data Pivotal Gemfire教程

pivotal1. Spring Data Pivotal Gemfire –简介 在这篇文章中&#xff0c;我们将介绍有关Spring Data Pivotal Gemfire的全面教程。 Pivotal Gemfire是由Apache Geode支持的内存中数据网格解决方案。 使用Pivotal Gemfire构建的应用程序使您可以在分布式服务器节点之间轻松扩展…

Linux命令之 chsh -- 用来更换登录系统时使用的shell

文章目录命令简介常用选项参考示例查看系统安装了哪些shell的两种方法查看当前正在使用的 shell修改当前登录用户的shell命令简介 chsh 命令用来更换登录系统时使用的shell。若不指定任何参数与用户名称&#xff0c;则 chsh 会以应答的方式进行设置。 chsh 用于更改登录 shell…

layui绑定json_JSON-B非对称属性绑定

layui绑定jsonJSON-B规范定义了诸如JsonbProperty或JsonbTransient类的绑定注释&#xff0c;以声明方式将Java对象映射到JSON&#xff0c;然后又映射回JSON。 这些注释可以“非对称地”用于定义序列化和反序列化的不同处理。 如果在Java属性上或在getter和setter上都注释了JSO…

熔断器

一、引入依赖 1.consumer_service中加入依赖 <!--开启熔断器--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>2.开启熔断的注解 //注…

Linux 命令之 pwck -- 用来验证系统认证文件内容和格式的完整性

文章目录命令介绍常用选项参考示例检验用户配置文件 /etc/passwd和/etc/shadow的内容是否合法、完整命令介绍 pwck 命令用来校验用户配置文件 /etc/passwd 和 /etc/shadow 内容是否合法或完整 常用选项 选项说明-q仅报告错误信息-s以用户id排序文件“/etc/passwd”和“/etc/…

不停机与停机更新_Istio的零停机滚动更新

不停机与停机更新本系列文章的第一部分介绍了如何在Kubernetes集群中实现真正的零停机时间更新。 我们专门解决了将流量从旧实例切换到新实例时出现的请求失败。 本文将展示如何使用Istio群集实现相同的目标。 服务网格技术&#xff08;例如Istio&#xff09;通常与容器编排结…

远程调用 Spring Cloud Feign

一、 Feign简介 Feign [feɪn] 译文 伪装。Feign是一个声明式WebService客户端.使用Feign能让编写WebService客户端更加简单,它的使用方法是定义一个接口&#xff0c;然后在上面添加注解。不再需要拼接URL&#xff0c;参数等操作。项目主页&#xff1a;https://github.com/Ope…