`
JohnnyJian
  • 浏览: 106079 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Groovy学习笔记——实现Ruby的case .. when表达式

阅读更多
今天看到有人在Groovy的邮件列表上问Groovy能不能支持Ruby的case ... when表达式:
car = "Patriot"

manufacturer = case car
  when "Focus": "Ford"
  when "Navigator": "Lincoln"
  when "Camry": "Toyota"
  when "Civic": "Honda"
  when "Patriot": "Jeep"
  when "Jetta": "VW"
  when "Ceyene": "Porsche"
  when "Outback": "Subaru"
  when "520i": "BMW"
  when "Tundra": "Nissan"
  else "Unknown"
end

puts "The " + car  + " is made by "  + manufacturer

然后Guillaume给出了这么一段代码:
def car = "Patriot"

def manufacturer = match(car) {
  when "Focus",     "Ford"
  when "Navigator", "Lincoln"
  when "Camry",     "Toyota"
  when "Civic",     "Honda"
  when "Patriot",   "Jeep"
  when "Jetta",     "VW"
  when "Ceyene",    "Porsche"
  when "Outback",   "Subaru"
  when "520i",      "BMW"
  when "Tundra",    "Nissan"
  otherwise         "Unknown"
}

println "The $car is made by $manufacturer"

def match(obj, closure) {
    closure.subject = obj
    closure.when = { value, result ->
        if (value == subject)
            throw new MatchResultException(result: result)
    }
    closure.otherwise = { return it }
    closure.resolveStrategy = Closure.DELEGATE_FIRST
    try {
        closure()
        closure.otherwise()
    } catch (MatchResultException r) {
        r.result
    }
}

class MatchResultException extends RuntimeException {
    def result
}

我不是很喜欢里面用异常来控制程序的流程,而且觉得“when "Focus", "Ford"”中间的逗号不够直观,因此就在上面的代码的基础上做了一些修改:
def match(subject, closure) {
    def whenMap = [:], otherwise = null
    closure.when = { map -> whenMap.putAll(map) }
    closure.otherwise = { otherwise = it }
    closure.resolveStrategy = Closure.DELEGATE_FIRST
    closure()
    def result = whenMap.find { condition, value -> subject in condition }
    return result ? result.value : otherwise
}

def manufacturer(car) {
    match(car) {
        when "Focus":     "Ford"
        when "Navigator": "Lincoln"
        when "Camry":     "Toyota"
        when "Civic":     "Honda"
        when "Patriot":   "Jeep"
        when "Jetta":     "VW"
        when "Ceyene":    "Porsche"
        when "Outback":   "Subaru"
        when "520i":      "BMW"
        when "Tundra":    "Nissan"
        otherwise         "Unknown"
    }
}

println "The Patriot is made by ${manufacturer('Patriot')}"
println "The QQ is made by ${manufacturer('QQ')}"

以上代码在Groovy 1.6下编译通过。
分享到:
评论

相关推荐

    Java JDK 6学习笔记——ppt简体版.rar

    这份"Java JDK 6学习笔记——ppt简体版"提供了关于这个关键版本的详细教程,适合初学者和有一定经验的开发者来深入理解Java编程。 首先,我们要了解Java JDK是什么。Java Development Kit,简称JDK,是Oracle公司...

    groovy-all-2.4.15.jar.zip

    groovy-all-2.4.15.jar文件,MAC使用时需存放在/Users/用户名/.gradle/caches/jars-3/某一缓存目录下,找不到就都看一下,我遇到的问题是缓存目录中下载的是2.4.17版本,应该跟gradle版本升级有关

    groovy-all-1.8.1.jar.zip

    "`在Groovy中即可实现,而在Java中则需要`System.out.println("Hello, World!");`。 2. 动态类型:Groovy支持动态类型,变量的类型在运行时确定,这使得编码更快速,但可能会带来一些潜在的类型错误。 3. 函数式...

    Groovy学习笔记 PDF版

    在《Groovy学习笔记》这本书中,你可能会学到如何快速入门Groovy,理解其基本语法,包括变量、控制流、类和对象的创建,以及如何利用Groovy的特性来提高开发效率。此外,书中可能还会涵盖Groovy在实际项目中的应用,...

    Groovy学习笔记.pdf

    Groovy还有许多其他特性,如GString(支持表达式的字符串)、groovy.sql.Sql(简化数据库操作)和GroovyShell(用于执行Groovy脚本)。对于初学者来说,深入理解这些基础知识是非常重要的,它们将帮助你更好地掌握...

    groovy-all-2.4.5-API文档-中英对照版.zip

    赠送jar包:groovy-all-2.4.5.jar; 赠送原API文档:groovy-all-2.4.5-javadoc.jar; 赠送源代码:groovy-all-2.4.5-sources.jar; 赠送Maven依赖信息文件:groovy-all-2.4.5.pom; 包含翻译后的API文档:groovy-all...

    安卓Andriod源码——微信分享Demo.zip

    通过学习这个Demo,开发者可以了解到如何在自己的应用中实现与微信的无缝连接,提升用户的社交体验。同时,这个过程也会帮助开发者理解Android与第三方应用交互的机制,对其他类似集成有指导意义。

    Groovy.in.Action.2nd.Edition.pdf

    本书适合想要深入学习Groovy语言的人,以及希望了解动态语言特性,并考虑使用Groovy进行实际项目开发的开发者。书中的示例代码清晰、完整,并且书中对Groovy的每个特性都做了详细解释,使读者能够快速掌握Groovy并...

    Groovy 学习笔记

    Groovy结合了Python、Ruby和Smalltalk等语言的特性,同时保留了与Java的无缝集成能力,使得它在编写脚本、构建工具、Web应用以及企业级应用程序开发中都有广泛的应用。 **一、Groovy基础** 1. **语法简洁**: ...

    Packtpub.Groovy.for.Domain.Specific.Languages.Jun.2010.rar

    总的来说,《Packtpub.Groovy.for.Domain.Specific.Languages.Jun.2010》这本书是Groovy初学者和经验丰富的开发者了解并掌握DSL设计和实现的宝贵资源。通过阅读这本书,读者将能够利用Groovy的强大功能,为特定业务...

    Apress.Beginning.Groovy.and.Grails.From.Novice.to.Professional.Jun.2008

    《Apress.Beginning.Groovy.and.Grails.From.Novice.to.Professional.Jun.2008》这本书深入浅出地介绍了Groovy语言和Grails框架,旨在帮助初学者快速掌握这两项技术并转化为专业人士。Groovy和Grails是Java生态中的...

    apache-groovy-sdk-2.5.15.zip

    - **src**:源代码,对于学习Groovy内部实现和调试很有帮助。 - **conf**:可能包含配置文件,如Groovy的类路径设置等。 了解和掌握Apache Groovy SDK 2.5.15,可以提升你在Java平台上开发的效率和灵活性,无论是...

    SpringBoot日记——日志框架篇.docx

    若要使用自己的日志配置,可以创建自定义的logback配置文件(如`logback-spring.xml`或`logback-spring.groovy`),并将其放置在类路径的根目录下,SpringBoot会自动识别并应用。同时,也可以针对不同环境(如开发、...

    Groovy-3.0.jar

    Groovy jar包 3.0.

    Java JDK 6学习笔记——ppt简体版附课本代码

    这份“Java JDK 6学习笔记——ppt简体版”涵盖了Java语言的核心概念、语法特性以及JDK 6的新功能,旨在帮助初学者和有经验的开发者深入理解并掌握这一版本的Java开发环境。 首先,Java JDK 6的安装与配置是学习的...

    Manning.Groovy.in.Action.Jan.2007

    Groovy是一种动态、灵活的Java平台上的脚本语言,它融合了多种语言特性,如Python、Ruby和JavaScript,同时又与Java代码无缝集成,使得开发人员能够在Java生态系统中快速构建应用程序。 Groovy的特点包括: 1. **...

Global site tag (gtag.js) - Google Analytics