一、枚举类型——新特性(将 switch 作为表达式)

这篇具有很好参考价值的文章主要介绍了一、枚举类型——新特性(将 switch 作为表达式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

switch 一直以来都只是一个语句,并不会生成结果。 JDK 14 使得 switch 还可以作为 一个表达式来使用,因此它可以得到一个值:

SwitchExpression.java

public class SwitchExpression {
    static int colon(String s) {
        var result = switch (s) {
            case "i":
                yield 1;
            case "j":
                yield 2;
            case "k":
                yield 3;
            default:
                yield 0;
        };
        return result;
    }

    static int arrow(String s) {
        var result = switch (s) {
            case "i" -> 1;
            case "j" -> 2;
            case "k" -> 3;
            default -> 0;
        };
        return result;
    }

    public static void main(String[] args) {
        for (var s : new String[]{"i", "j", "k", "z"}) {
            System.out.format("%s %d %d%n", s, colon(s), arrow(s));
        }
    }
}

运行结果如下:

一、枚举类型——新特性(将 switch 作为表达式)

如 colon() 中所示,在使用旧的冒号语法的同时,可以使用新的 yield 关键字从 switch中 返回结果。注意在使用 yield 的时候,并不需要用到 break ——实际上如果加上了 break,反而会在编译时产生错误消息“试图跳出switch表达式”(attempt to break out of a switch expression)。

如果试图在 switch 语句中使用 yield,编译器会产生错误消息“在 switch 表达式外部 yield ”(yield out side of switch expression)。

arrow() 会产生和 colon() 相同的效果,但是要注意这样的语法会更清晰、更紧凑,也更易读。可以看看这种方式为 TrafficLight.java 带来的改进(相较于在本章前面实现的版本):

EnumSwitch.java

public class EnumSwitch {
    enum Signal {GREEN, YELLOW, RED,}

    Signal color = Signal.RED;

    public void change() {
        color = switch (color) {
            case RED -> Signal.GREEN;
            case GREEN -> Signal.YELLOW;
            case YELLOW -> Signal.RED;
        };
    }
}

同样,如果在不加上 case BLUE 的情况下将 BLUE 加入到 enum Signal 中,Java的反应则是“switch 表达式并未覆盖所有可能的输人值”(the switch expression does not cover all possible input values)。编译器会确保在修改代码的时候不会缺少case。

如果一个case需要多个语句或表达式,那就将它们放在一对花括号中。

Planets.java

enum CelestialBody {
    MERCURY, VENUS, EARTH, MARS, JUPITER,
    SATURN, URANUS, NEPTUNE, PLUTO
}

public class Planets {
    public static String classify(CelestialBody b) {
        var result = switch (b) {
            case MERCURY, VENUS, EARTH,
                    MARS, JUPITER,
                    SATURN, URANUS, NEPTUNE -> {
                System.out.print("A planet: ");
                yield b.toString();
            }
            case PLUTO -> {
                System.out.print("Not a planet: ");
                yield b.toString();
            }
        };
        return result;
    }

    public static void main(String[] args) {
        System.out.println(classify(CelestialBody.MARS));
        System.out.println(classify(CelestialBody.PLUTO));
    }
}

运行结果如下:

A planet: MARS
Not a planet: PLUTO

注意,在从多行代码组成的 case 表达式中生成结果时,即便使用了箭头语法,也要使用 yield。文章来源地址https://www.toymoban.com/news/detail-515381.html

到了这里,关于一、枚举类型——新特性(将 switch 作为表达式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java语言----反射、枚举以及lambda表达式

    目录 一.反射 1.1反射的基本情况 1.2反射中最重要的类 1.2.1 Class类 1.2.2Field类 1.2.3Constructor类 1.2.4Method类 1.3反射优缺点  二.枚举 2.1概念 2.2枚举(enum)类方法 2.3枚举的构造 三.Lambda表达式 3.1Lambda介绍 3.2 函数式接口 3.3使用lambda表达式 3.2.1不使用Lambda表达式调用 3.2.2使用Lambda表

    2024年02月08日
    浏览(49)
  • 【数据结构】反射、枚举以及lambda表达式

    Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任 意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信 息以及动态调用对象方法的功能称为java语言的反射

    2024年03月13日
    浏览(40)
  • 7.JS里表达式,if条件判断,三元运算符,switch语句,断点调试

    表达式就是可以被求值的代码比如什么a = 1 语句就是一段可以执行的代码比如什么if else 直接给B站的黑马程序员的老师引流一波总结的真好 就是基本上所有的语言都会有的if else 语句就是满足不同的条件执行不同的代码,让计算机有条件判断的能力。 注意在if的括号里面除了

    2024年02月20日
    浏览(52)
  • Java新特性:Lambda表达式

    Java新特性:Lambda表达式 Lambda 表达式(Lambda expression),也可称为闭包(Closure),是 Java(SE)8 中一个重要的新特性。Lambda 表达式允许我们通过表达式来代替功能接口。Lambda 表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表

    2024年02月13日
    浏览(56)
  • C++11新特性lambda 表达式

    Lambda 表达式的基本语法是:[] (参数列表) - 返回值类型 {函数体}。 方括号([])表示捕获列表,用来指定在 lambda 表达式中可以访问的外部变量。 参数列表和返回值类型与普通函数的参数列表和返回值类型相同。 函数体则是实际的代码逻辑。 不接受任何参数:[] { 函数体 } 接受

    2024年02月14日
    浏览(39)
  • String、反射、枚举、lambda表达式以及泛型进阶(数据结构系列16)

    目录 前言: 1. String 1.1 字符串常量池 1.1.1 创建对象的思考 1.1.2 字符串常量池(StringTable) 1.1.3 再谈String对象创建 1.1.4 intern方法 2. 反射 2.1 反射的定义 2.2 反射的用途 2.3 反射的基本信息 2.4 反射相关的类 2.4.1 Class类(反射机制的起源) 2.4.1.1 Class类中的相关方法 2.5 反

    2024年02月11日
    浏览(57)
  • Java8新特性-Lambda表达式

    Lambda表达式 Lambda是一个匿名函数, 可以把lambda表达式理解为是一段可以传递的代码,(将代码像数据一样传递) 变化 需求: 求 薪资高于5000的员工信息 Lambda基本语法 在 java8 中引入了一个新的操作符 \\\"-\\\" , 箭头操作符, 箭头操作符 将Lambda表达式拆分为两部分: 左侧: Lambda表达式的参

    2024年02月01日
    浏览(42)
  • Java 8 新特性——Lambda 表达式(2)

            Java Stream函数式编程接口最初在Java 8中引入,并且与 lambda 一起成为Java开发里程碑式的功能特性,它极大的方便了开放人员处理集合类数据的效率。         Java Stream就是一个数据流经的管道,并且在管道中对数据进行操作,然后流入下一个管道。有学过linux

    2024年02月11日
    浏览(42)
  • C11新特性之Lambda表达式

    优点:  1.可以定义简短的函数。 2.使用lambda表达式使代码更紧凑,可读性更好。 语法: [] 表示不捕获任何变量 [this] 表示值传递方式捕捉当前的 this 指针  [] 表示引用传递方式捕捉所有父作用域的变量(包括 this ) [var] 表示 引用传递 捕捉变量 var [=] 表示值传递方式捕获所

    2023年04月22日
    浏览(43)
  • Java 8 新特性之Lambda表达式

    函数式编程(Functional Programming)是把函数作为基本运算单元,函数可以作为变量,可以接收函数,还可以返回函数。历史上研究函数式编程的理论是Lambda演算,所以我们经常把支持函数式编程的编码风格称为Lambda表达式。 在Java中使用Lambda表达式的前提:需要是函数接口。

    2024年01月22日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包