休息一下,或者:如何使用Java 12制作出色的拼图游戏

Java 12以实验形式提供了switch表达式以及switchbreak语句的新形式。 对于可能很少用到的构造,有大量新语法和语义,当然,对于那些困惑者和认证考试问题的作者来说,这是一件了不起的礼物。 如果您喜欢Java难题,并且可能想自己创建一些,请继续阅读。

Java 12表达式开关

Java的12只引入了一个表达切换 -a版本的switch是一个表达式,而不是一个声明。 这是一个简单的示例:

enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY };
public static int numLetters(Day day) {return switch (day) {case MONDAY, FRIDAY, SUNDAY -> 6;case TUESDAY -> 7;case THURSDAY, SATURDAY -> 8;default -> 9;};
}

真好。

请注意,这种形式的switch是一个表达式 。 在这种情况下,它的值是return语句中的表达式。 您还可以将switch表达式分配给变量,将其作为方法参数传递,并执行Java中的表达式可以执行的所有其他操作。

该图简要说明了它:

表达 声明
双向分支 ? : if / else
多路分支 switch switch

为多向分支表达式指定一个运算符会更加一致吗? 当然可以,但是……插入邪恶的笑声……这样我们就可以做更好的益智游戏!

前进。 试试看。 您在哪里可以使用表达式? 当然在switch语句中。

switch (switch (...) { case ... -> ...; case ... -> ... }) {case ...: ...; case ...: ...; 
}

填写一些有趣的内容...然后询问结果是什么。 还要选择“它不会编译”。 (这就是答案。请注意表达式switch的第二个case分支中缺少的分号。)

此表达式switch具有显着的功能: 不会掉线 。 您不必在每个case分支的末尾都放一个break

太好了-缺少break是一个常见错误。 但是对于益智游戏制造商来说,这似乎是倒退了一步。

别失望 我将为您带来好消息。

价值突破

假设您要在分支之一中记录某些内容。

case TUESDAY -> { logger.info("Belgium?"); 7 } // Not legal Java

那是Scala语法。 在Scala中,块是一个表达式,其值是该块的最后一个表达式。 在此示例中,为7。但是Java没有块表达式。

Java 12(其版本号使我们联想到圣诞节的12个夜晚),附带了给拼图制作者的礼物:新的break声明。 它的目的是从case分支的一个块中返回一个值:

case TUESDAY -> { logger.info("Belgium?"); break 7; }

顺便说一句, ->专门用来提醒您lambda表达式。 在lambda表达式中,您有类似的问题。 假设您有一个产生表达式的lambda表达式。

Runnable task = () -> 42;

现在,您想添加一个日志记录调用。 您做的事情很相似:

表达 声明
拉姆达 Runnable r = () -> 42; Runnable r = () -> { logger.log(...); return 42; };
case分支 case ... -> 42; case ... -> { logger.log(...); break 42; }

顺便说一句,老鹰眼的读者会注意到,该表的一个象限中没有末端分号。 更多益智游戏材料…

这个break语句确实像return 。 它可以嵌套在另一个块中,然后跳到外面,产生值。

case ... -> { if (n % 2 == 0) break 42; else { logger.log(...); break 21; } }

当然,在loop和switch语句中, break含义已经不同。 例如,这是非法的:

case ... -> {for (int i = 0; i < a.length; i++) {if (a[i] == x) break i; // Error}break -1;
}

breakreturn完全相同,但在内部循环和switch语句中除外,在此禁止。 继续吧-立即解决这个问题。 你知道你想。

标记的休息时间

早在1995年,Java 1.0就引入了诸如类和接口,垃圾回收和Unicode字符串之类的创新,同时坚持使用C语言语法来编写许多程序员熟悉的控制结构。 除了一个小变化。

在Java中,您可以使用带标签的 break中断嵌套循环,并到达循环的结尾 ,该循环的开头具有匹配的标签。 像这样:

int i = 0;
int j = 0;
found:
while (i < a.length) {while (j < a[i].length) {if (a[i][j] == x) break found;j++;}i++;
}
// Execution continues here after break found;

您曾经使用此功能吗? 如果没有,请不要担心。 除了认证考试,很少有人参加。

如果您在带有break foo;case有一个循环,该怎么办? ? 这完全取决于。 如果foo作为封闭循环的标签出现,则您有一个标记的break 。 如果不是,并且foo是一个变量,则您有一个值break 。 如果你们两个都有呢? 那是语法错误。

继续,做一个令人困惑的事情。 你知道你想。

箭头开关语句

再看一下表达式switch语法。 你可以说

case MONDAY, FRIDAY, SUNDAY ->

代替

case MONDAY: case FRIDAY: case SUNDAY:

很好-替代方法看起来很奇怪:

case MONDAY -> case FRIDAY -> case SUNDAY -> // Just kidding

表情switch真是太好了。 没有失败。 无需重复caseswitch语句变得令人羡慕。

因此,Java设计师决定变得不错,并允许它参与其中。 您现在可以编写:

switch (day) {case MONDAY, FRIDAY, SUNDAY -> // No repeating of casenumLetters = 6; // No fallthrough after ->case TUESDAY -> { logger.info("Tuesday"); numLetters = 7; } case THURSDAY, SATURDAY -> numLetters = 8; default -> numLetters = 9; 
}

顽皮开关表达式

现在该轮到表情switch 。 现在switch语句有两种形式:顽皮(1970年左右)和nice(2018年)。 如果表情switch想要调皮,会跌倒怎么办?

这是2 x 2图表的谬误出现的地方:

表达 声明
没有失败
int numLetters = switch (day) {case MONDAY, FRIDAY, SUNDAY -> 6;case TUESDAY -> 7;case THURSDAY, SATURDAY -> 8;default -> 9;
};
switch (day) {case MONDAY, FRIDAY, SUNDAY ->numLetters = 6;case TUESDAY -> {logger.info("Tuesday");numLetters = 7;}case THURSDAY, SATURDAY ->numLetters = 8;default ->numLetters = 9;
}
跌倒
???
switch(day) {case MONDAY, FRIDAY, SUNDAY:numLetters = 6;break;case TUESDAY:logger.info("Tuesday");numLetters = 7;break;case THURSDAY:logger.info("Thursday");      case SATURDAY:numLetters = 8;break;default:numLetters = 9;
}

我们真的需要填写缺失的象限吗?

显然是的。

int numLetters = switch(day) {case MONDAY, FRIDAY, SUNDAY:break 6;case TUESDAY:logger.info("Tuesday");break 7;case THURSDAY:logger.info("Thursday"); // Fallthroughcase SATURDAY:break 8;default:break 9;
};

可以在同一switch混合case ...:case ... ->吗? 可悲的是没有。 曾经考虑过这一点,但是反益智游戏游说组织了这一天。

您可以为第一个分支执行case MONDAY: case FRIDAY: case SUNDAY:吗? 您可以为此感到困惑,但是到那时,您的听众可能已经失去了生存的意愿。

为您准备的圣诞节前益智游戏

当我对所有这些进行演讲时,我知道我必须做一个困惑者。 这个开关是调皮的还是不错的? 它有什么作用?

int n = 0;n = switch (n) {case 0:n++;default: {O:while (n > 0) {if (n == 1) break O;n--;}if (n > 0) break n;elsebreak 0;}};
  1. 语法错误
  2. 有无限循环
  3. n设置为0
  4. n设为1

翻译自: https://www.javacodegeeks.com/2018/12/give-me-break-make-awesome-puzzlers.html

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

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

相关文章

蓝桥杯基础模块5:外部中断

一、模块题目 二、原理简述 (转载,删改) 1、什么是中断 你正在追电视剧《神雕侠侣》,正看得入迷的时候,电话响了,你暂停电视剧,去接电话,在接电话的过程中,门铃又响了,你暂时放下电话,去把门打开。如果追电视剧是在执行主程序,那么电话就是中断源,电话铃响了就是中…

【渝粤教育】广东开放大学 商务谈判 形成性考核 (34)

选择题 题目&#xff1a; 对明智的谈判者而言&#xff0c;应当在保持&#xff08;&#xff09;的基础上&#xff0c;追求自己利益的最大化&#xff0c;在使对方通过谈判获得利益时&#xff0c;自己也获得相应的利益。 选择一项&#xff1a; 答案&#xff1a;看左侧 题目&#…

【渝粤教育】广东开放大学 数据结构 形成性考核 (30)

选择题 题目&#xff1a;链接存储的存储结构所占存储空间&#xff08; &#xff09; 题目&#xff1a;线性表若采用链式存储结构时&#xff0c;要求内存中可用存储单元的地址&#xff08; &#xff09;。 题目&#xff1a;顺序表中第一个元素的存储地址是100&#xff0c;每个元…

蓝桥杯基础模块06_1:定时器计数器

一、模块题目 二、原理简述 &#xff08;转载&#xff0c;删改&#xff09; 1、定时器、计数器定义 在没有钟表的时候&#xff0c;定时的方式通过有一注香的时间&#xff0c;或者一桶水的时间。前者烧香不断减少是减法&#xff0c;后者滴水不断增加是加法。 定时/计数器&#…

structure101_使用structure101分析软件包的依赖关系

structure101稳定应用程序的一个关键是结构良好的代码库。 我们知道我们应该建立尽可能多的黑匣子&#xff0c;因为一旦完成一个黑匣子&#xff0c;我们就不必再考虑其内部了。 您只需要使用您或其他团队成员通过明确定义的界面编写的代码即可。 这使您可以专注于要添加的下一个…

【渝粤教育】广东开放大学 机械制造基础 形成性考核 (55)

选择题 题目&#xff1a;车削加工中大部分切削热传给了&#xff08; &#xff09; 题目&#xff1a;下列诸因素中,哪个是造成45钢淬火硬度偏低的主要原因&#xff08; &#xff09; 题目&#xff1a;切削用量中对切削力影响最大的因素是背吃刀量。 题目&#xff1a;焊接接头中的…

【渝粤教育】广东开放大学 电子商务(本) 形成性考核 (21)

选择题 题目&#xff1a;&#xff08; &#xff09;的域名含义是政府组织。 答案&#xff1a;看左侧 题目&#xff1a;&#xff08; &#xff09;是指包含巨量资料的信息资产&#xff1f; 答案&#xff1a;看左侧 题目&#xff1a;www.sina.com.cn的二级域名是&#xff08; &…

蓝桥杯基础模块6_2:定时器进阶

一、模块题目 二、原理图 1、数码管

JDK 9 / JEP 280:字符串串联永远不会相同

JEP 280 &#xff08;“ Indify String Concatenation”&#xff09;是与JDK 9结合实现的&#xff0c;根据其“摘要”部分&#xff0c;“更改了javac生成的静态String -concatenation字节码序列&#xff0c;以使用对JDK库函数的invokedynamic调用。 ” 通过查看在JDK 9之前和JD…

【渝粤教育】广东开放大学 综合英语1 形成性考核 (36)

选择题 题目&#xff1a; I love traveling in the countryside, but I don’t like losing my way. I went on a trip recently, but my trip took me longer than I expected. “I’m going to Woodford Green,” I said to the conductor as I got on the bus, “b…

蓝桥杯基础模块7:PWM脉宽调制

一、 模块题目 二、 原理简述 脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。随着电子技术的发展,出现了多种脉冲宽度调制(Pulse width modulation,PWM)技术,其中包括:相电压控…

【渝粤教育】电大中专Office办公软件 (14)作业 题库

1学习好Office办公软件这门课程&#xff0c;应该&#xff08;&#xff09;。 A重视理论学习 B重视上机操作&#xff0c;多练多试&#xff0c;还要学习好基础的知识 C只看不练 D可以随便学习一下 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;B 2在使用Office2016时遇…

蓝桥杯基础模块8_1:串口通信收发

一、模块题目 二、原理简述 1、串口重要概念概述 <1> 串行通信是指数据一位接一位地顺序发送或接收。 <2> 串行通信有SPI、IIC、UART等多种,最常见最通用的是指UART,无特殊说明,本文指的就是UART。 <3> 串行通信的制式有:单工、半双工、全双工三种。 &l…

【渝粤教育】电大中专中医基础知识 作业 题库

1.“证”是指 A.疾病的体征与症状 B.对疾病的症状与体征的分析 C.对疾病某一阶段的病理概括 D.对疾病全过程规律的认识 E.对疾病的症状与体征的调查 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;未作答 2.中医学认识疾病和治疗疾病的基本思路是 A.恒动观念 B.同病异…

从JDK 12删除原始字符串文字

已经提出从JDK 12 &#xff08;它将在12月13日进入Rampdown第一阶段 &#xff09;中删除原始字符串文字&#xff08;预览 &#xff09;。 Brian Goetz撰写了删除此预览功能的动机的详细描述 &#xff08; JEP 326 &#xff09;。 在Java subreddit上也对此进行了讨论。 在帖子“…

【渝粤教育】电大中专公共基础课程_1作业 题库

1中央广播电视中等专业学校是一所依托&#xff08;&#xff09;设置的运用现代化教学手段和多媒体教学开展中等专业学历教育的开放性学校。 A国家开放大学 B技工学院 C技能培训学校 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2并面向社会直接招收初中毕业生和在…

蓝桥杯基础模块8_2:串口进阶

一、模块题目 二、原理简述 串行接口作为51单片机的重要外设,编程操作并不复杂,但在实际的项目应用中,由于数据结构和通信规约的不同,其程序逻辑也有各种变化。 一般情况下,上位机的命令可能不是一个字节,而是多个字节组成的命令帧,有的长度固定,有的长度变化;而且要…

【渝粤教育】电大中专常见病药物治疗 (3)作业 题库

1.以下对‘发热的指标’的叙述中&#xff0c;不正确的是&#xff08;&#xff09;。 A.腋下温度超过37.0℃ B.口腔温度超过37.3℃ C.直肠温度超过37.6℃ D.腋下温度超过37.6℃ E.昼夜体温波动超过1℃ 错误 正确答案&#xff1a;左边查询 学生答案&#xff1a;E 2.发热的程度按体…

蓝桥杯基础模块9:IO口扩展与存储器映射

一、模块题目 二、原理简述 三、源码 (1)I0扩展 //头文件 #include "reg52.h" //延时函数 void Delay(unsigned int t) {

【渝粤教育】电大中专建设工程法规 (3)作业 题库

1建造师在工作中&#xff0c;必须严格遵守法律、行政、行业管理规范、职业道德。 A正确 B错误 正确 正确答案&#xff1a;左边查询 学生答案&#xff1a;A 2注册建造师应当在相应的岗位上执业。但同时&#xff0c;国家鼓励和提倡注册建造师()。 A一师专岗 B一师多岗 C专岗专职 …