Java 13 –开关表达式

电玩女神 2023-02-15 05:07 86阅读 0赞

切换表达切换表达

在Java 13中, JEP 354:交换表达式通过添加新的yield关键字从交换表达式返回值来扩展了先前的Java 12交换表达式。

PS Switch表达式是预览功能,默认情况下处于禁用状态。

注意
这是Java 14中的标准功能。

1.没有更多的价值突破!

1.1 Java 12 value breaks语法不再在Java 13中编译,而是使用yield

  1. // value breaks are superseded by Java 13 'yield' statements.
  2. private static int getValueViaBreak(String mode) {
  3. int result = switch (mode) {
  4. case "a":
  5. case "b":
  6. break 1;
  7. case "c":
  8. break 2;
  9. case "d":
  10. case "e":
  11. case "f":
  12. break 3;
  13. default:
  14. break -1;
  15. };
  16. return result;
  17. }

1.2在Java 13中,我们可以使用yield返回一个值。

  1. private static int getValueViaYield(String mode) {
  2. int result = switch (mode) {
  3. case "a", "b":
  4. yield 1;
  5. case "c":
  6. yield 2;
  7. case "d", "e", "f":
  8. // do something here...
  9. System.out.println("Supports multi line block!");
  10. yield 3;
  11. default:
  12. yield -1;
  13. };
  14. return result;
  15. }

1.3 Java 13仍支持switch表达式(Java 12)的标签规则或箭头。

  1. private static int getValueViaArrow(String mode) {
  2. int result = switch (mode) {
  3. case "a", "b" -> 1;
  4. case "c" -> 2;
  5. case "d", "e", "f" -> {
  6. // do something here...
  7. System.out.println("Supports multi line block!");
  8. yield 3;
  9. }
  10. default -> -1;
  11. };
  12. return result;
  13. }

2. Java 13开关表达式

Java 13中的完整switch表达式示例。

JEP354.java

  1. package com.mkyong.java13;
  2. public class JEP354 {
  3. public static void main(String[] args) {
  4. System.out.println(getValueViaYield("a"));
  5. System.out.println(getValueViaYield("c"));
  6. System.out.println(getValueViaYield("e"));
  7. System.out.println(getValueViaYield("z"));
  8. }
  9. // Traditional switch
  10. private static int getValueBefore12(String mode) {
  11. int result;
  12. switch (mode) {
  13. case "a":
  14. case "b":
  15. result = 1;
  16. break;
  17. case "c":
  18. result = 2;
  19. break;
  20. case "d":
  21. case "e":
  22. case "f":
  23. result = 3;
  24. break;
  25. default:
  26. result = -1;
  27. }
  28. ;
  29. return result;
  30. }
  31. // Java 12, multiple comma-separated labels
  32. private static int getValueMultipleLabels(String mode) {
  33. int result;
  34. switch (mode) {
  35. case "a", "b":
  36. result = 1;
  37. break;
  38. case "c":
  39. result = 2;
  40. break;
  41. case "d", "e", "f":
  42. result = 3;
  43. break;
  44. default:
  45. result = -1;
  46. }
  47. ;
  48. return result;
  49. }
  50. // Java 13, value breaks are superseded by 'yield' statements
  51. // Java 12, switch expression returning value via break
  52. /*private static int getValueViaBreak(String mode) {
  53. int result = switch (mode) {
  54. case "a":
  55. case "b":
  56. break 1;
  57. case "c":
  58. break 2;
  59. case "d":
  60. case "e":
  61. case "f":
  62. break 3;
  63. default:
  64. break -1;
  65. };
  66. return result;
  67. }*/
  68. // Java 12, switch expression returns a value via label rules (arrow)
  69. private static int getValueViaArrow(String mode) {
  70. int result = switch (mode) {
  71. case "a", "b" -> 1;
  72. case "c" -> 2;
  73. case "d", "e", "f" -> {
  74. // do something here...
  75. System.out.println("Supports multi line block!");
  76. yield 3;
  77. }
  78. default -> -1;
  79. };
  80. return result;
  81. }
  82. // Java 13, switch expression returns a value via yield
  83. private static int getValueViaYield(String mode) {
  84. int result = switch (mode) {
  85. case "a", "b":
  86. yield 1;
  87. case "c":
  88. yield 2;
  89. case "d", "e", "f":
  90. // do something here...
  91. System.out.println("Supports multi line block!");
  92. yield 3;
  93. default:
  94. yield -1;
  95. };
  96. return result;
  97. }
  98. }

输出量

  1. 1
  2. 2
  3. Supports multi line block!
  4. 3
  5. -1

3.启用预览功能

3.1正常的javac编译将提示以下错误:

  1. $ javac JEP354.java
  2. D:\test>javac JEP354.java
  3. JEP354.java:39: error: multiple case labels are a preview feature and are disabled by default.
  4. case "a", "b":
  5. ^
  6. (use --enable-preview to enable multiple case labels)
  7. JEP354.java:76: error: switch expressions are a preview feature and are disabled by default.
  8. int result = switch (mode) {
  9. ^
  10. (use --enable-preview to enable switch expressions)
  11. JEP354.java:77: error: switch rules are a preview feature and are disabled by default.
  12. case "a", "b" -> 1;
  13. ^
  14. (use --enable-preview to enable switch rules)
  15. 3 errors

3.2我们需要手动启用预览功能:

  1. javac --enable-preview --release 13 Example.java
  2. java --enable-preview Example

参考文献

  • OpenJDK 13项目
  • JEP-354:开关表达式(预览)
  • Java 12 –开关表达式
  • JEP 325:开关表达式
  • JEP 305:用于instanceof的模式匹配
  • Java版本历史

标签: Java Java 13 新功能 开关

翻译自: https://mkyong.com/java/java-13-switch-expressions/

发表评论

表情:
评论列表 (有 0 条评论,86人围观)

还没有评论,来说两句吧...

相关阅读

    相关 (13)正则表达式

    正则表达式:其实一种规则,有自己特殊的应用,其作用就是针对于字符串进行操作。 正则:就是用于操作字符串的规则,其中这些规则使用了一些字符表示。 1正则表达式的符号 预