通过Groovy来消除代码噪声

Java是在JVM上运行的最广泛使用的编程语言。不过,还有很多其他基于JVM的语言,比如Groovy,Scala,JRuby,Jython,Kotlin等等。其中,Groovy和Scala现在在Java社区中已经被广泛采用并大受欢迎。 本文介绍如何在Spring Boo中使用Groovy语言来编程。

Groovy

Groovy是一种基于Java的语法的基于JVM的编程语言。Groovy支持动态输入,闭包,元编程,运算符重载等等语法。除此之外,Groovy还提供了许多类似脚本语言的功能,比如,多行字符串,字符串插值,优雅的循环结构和简单的属性访问。另外,结尾分号是可选的。而这些都有足够的理帮助开发人员为了提高开发效率。

换句话说,Groovy就是一种继承了动态语言的优良特性并运行在JVM上的编程语言。由于Groovy的语法非常接近Java,所以Java开发人员很容易开始使用Groovy。 Spring Boot应用中也支持使用Groovy编程语言进行开发。

Groovy字符串

我们可以使用单引号或双引号在Groovy中创建字符串。当使用单引号时,字符串被看作为java.lang.String的一个实例,而当使用双引号时,它被会被看为groovy.lang.Gstring的一个实例,支持字符串变量值。

def name = "zhangsan"
def amount = 120
println('My name is ${name}')
println("My name is ${name}")
println("He paid \$${amount}") def age = 20
print("Her age is ${age}")

输出结果为:

由于在第一个println()语句中使用单引号,所以,$会按原样打印,而在第二个()语句中使用双引号,则会打印变量值。如果需要打印 {name}会按原样打印,而在第二个println()语句中使用双引号,则会打印变量值。如果需要打印$符号,则需要还是用转义字符\ 。并且,Groovy还支持使用三个引号(“”“或”’“)的多行字符串,如下所示:

//使用单引号
def content = '''My Name is zhangsan.
I live in china.
I am a software developer'''
def name1 = 'zhangsan'
def address = 'china'
def occupation = 'software developer' //使用双引号
def bio = """My name is ${name1}.
I live in ${address}.
I am a ${occupation}."""

Groovy在多行创建跨越一行的字符串时非常方便,比如,表格,带占位符的HTML模板等。

POJO属性

在Java中,一般是通过为这些属性创建私有属性和getter、setter方法来获取和创建Bean。 虽然我们可以使用IDE生成setter和getter,但还是稍微有点繁杂,特别是增删改属性后。

而在Groovy中,我们直接通过声明属性来创建bean,然后使用object.propertyName语法访问它们,而无需创建setter和getters。如下代码片段:

package com.groovydemo.groovy.entity

class Stu {
Integer id;
String name;
Integer age; }

在这里,我们可以看到值直接被分配给了Bean的属性,比如 p.id = 1,而不需要为id创建setter。 同样,可以使用p.id读取属性ID,而不需要获取id的getter。 因为Groovy会默认将为这些属性生成setter和getters,省去手动的get和set操作。

循环语法

除了常规while和for循环之外,Groovy还支持各种循环结构。比如,使用范围运算符(..)进行迭代,如下例子:

1、常规for用法:

for(i in 0..5) { print "${i}" }1

输出:

0 1 2 3 4 5

2、使用upto()的来确定下限和上限:

0.upto(3) { print "$it " }1

输出:

0 1 2 3

3、使用times()从0开始迭代:

5.times { print "$it " }1

输出:

0 1 2 3 4

4、使用step()的下限和上限,来迭代并使用步长值:

0.step(10, 2) { print "$it "}1

输出:

0 2 4 6 8

实战:在Spring Boot中使用Groovy

我们可以使用IDE,也可以使用在线Spring Boot应用程序生成器http://start.spring.io创建应用,并选择Groovy作为编程语言。

以Maven构建工具为例,使用插件:gmavenplus-plugin编译Groovy代码。如下代码所示。

pom.xml:

<?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="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com</groupId>
<artifactId>groovy-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>groovy-demo</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version> </properties> <dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>2.4.15</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- groovy -->
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>addSources</goal>
<goal>addTestSources</goal>
<goal>generateStubs</goal>
<goal>compile</goal>
<goal>testGenerateStubs</goal>
<goal>testCompile</goal>
<goal>removeStubs</goal>
<goal>removeTestStubs</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>

Stu:

package com.groovydemo.groovy.entity

class Stu {
Integer id;
String name;
Integer age; }

StuController:

package com.groovydemo.groovy.controller

import com.groovydemo.groovy.entity.Stu
import com.groovydemo.groovy.service.StuService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController @RestController
@RequestMapping("Stu")
class StuController { @Autowired
private StuService service; @GetMapping("/test")
String test(){ Stu stu = service.getStuByid(1);
return "Ok==>You can use groovy!";
}
}

StuService:

package com.groovydemo.groovy.service

import com.groovydemo.groovy.entity.Stu

interface StuService {
Stu getStuByid(int i)
}

StuServiceImpl:

package com.groovydemo.groovy.service.impl

import com.groovydemo.groovy.entity.Stu
import com.groovydemo.groovy.service.StuService
import org.springframework.stereotype.Service @Service
class StuServiceImpl implements StuService {
@Override
Stu getStuByid(int i) { Stu stu = new Stu();
stu.setId(1);
stu.setName("zhangsan");
stu.setAge(18);
return stu;
}
}

RunAppGroovy:

package com.groovydemo

import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication @SpringBootApplication
class RunAppGroovy { static void main(String[] args) {
SpringApplication.run RunAppGroovy,args
} }

访问:http://localhost:8080/Stu/test

结果如下:

Ok==>You can use groovy!

通过Groovy来消除代码噪声的更多相关文章

  1. 用T4消除代码重复,对了,也错了

    用T4消除代码重复,对了,也错了 背景 我需要为int.long.float等这些数值类型写一些扩展方法,但是我发现他们不是一个继承体系,我的第一个思维就是需要为每个类型重复写一遍扩展方法,这让我觉得 ...

  2. 使用yaml+groovy实现Java代码可配置化

    背景与目标 在使用函数接口和枚举实现配置式编程(Java与Scala实现),使用了函数接口和枚举实现了配置式编程.读者可先阅读此文,再来阅读本文. 有时,需要将一些业务逻辑,使用配置化的方式抽离出来, ...

  3. Groovy学习:第一章 用Groovy简化Java代码

    1. Groovy的安装 目前Groovy的最新版本为2.1.2版,下载地址为:http://groovy.codehaus.org/Download下载后解压groovy-binary-2.1.2. ...

  4. 使用Java8中的Optional类来消除代码中的null检查

    简介 Optional类是Java 8新增的一个类,Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException). —— 每个 Java 程序员都非常了解的异常 ...

  5. Java-Annotation的一种用法(消除代码中冗余的if/else或switch语句)

    Java-Annotation的一种用法(消除代码中冗余的if/else或switch语句) 1.冗余的if/else或switch ​ 有没有朋友写过以下的代码结构,大量的if/esle判断,来选择 ...

  6. Java8-Function使用及Groovy闭包的代码示例

    导航 定位 概述 代码示例 Java-Function Groovy闭包 定位 本文适用于想要了解Java8 Function接口编程及闭包表达式的筒鞋. 概述 在实际开发中,常常遇到使用模板模式的场 ...

  7. Speex回声消除代码分析

    先说明下,这里的代码流程是修改过的Speex流程,但与Speex代码差异不大,应该不影响阅读.   (1)用RemoveDCoffset函数进行去直流 (2)远端信号预加重后放入x[i+frame_s ...

  8. 【转】消除代码中的 if-else/switch-case

    在很多时候,我们代码中会有很多分支,而且分支下面的代码又有一些复杂的逻辑,相信很多人都喜欢用 if-else/switch-case 去实现.做的不好的会直接把实现的代码放在 if-else/swit ...

  9. Java8函数接口实现回调及Groovy闭包的代码示例

    本文适用于想要了解Java8 Function接口编程及闭包表达式的筒鞋. 概述 在实际开发中,常常遇到使用模板模式的场景: 主体流程是不变的,变的只是其中要调用的具体方法. 其特征是:   Begi ...

随机推荐

  1. py-opp 类(class)

    类的创建 class 类名: pass class Bar: def foo(self,arg): # self ,是传的实例对象, print('self:',self,arg) #因为类属性和方法 ...

  2. spring boot docker 初尝试

    Docker服务中进程间通信通过/var/run/docker.sock实现,默认服务不提供监听端口,因此使用docker remote api 需要手动绑定端口. 在centos7.2下,可以进行这 ...

  3. xib创建cell的两种方法

    方法一:第一步:[self.collectionView registerNib:[UINib nibWithNibName:@"QGLShareBtnCell" bundle:n ...

  4. word中添加引文操作

    word中添加引文操作 转化为pdf的时候,可以通过引文处进行ctrl + 左键点击,挑战到相应的后文中的参考引文位置. 1.在文章末尾添加如下内容,并在他的下面添加一条被引文的格式

  5. 洛谷P1600 天天爱跑步(线段树合并)

    小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn ...

  6. 使用WebService与Oracle EBS进行集成

    http://www.cnblogs.com/isline/archive/2010/04/15/1712428.html 一.概述 OracleEBS是Oracle公司的ERP产品,这个产品非常庞大 ...

  7. [翻译] Using Custom Functions in a Report 在报表中使用自己义函数

    Using Custom Functions in a Report  在报表中使用自己义函数   FastReport has a large number of built-in standard ...

  8. SoapUI5.1.2安装和破解教程

    一.SoapUI简介 soapui提供一个工具通过soap/http来检查,调用,实现web service和web service的功能/负载/符合性测试. 该工具既可作为一个桌面应用软件使用,也可 ...

  9. Asp.Net Mvc ScriptBundle 脚本文件捆绑压缩 导致 脚本出错的问题

    由于捆绑压缩会对所有包含的文件进行压缩,无法设置忽略对某个js文件的压缩.导致压缩该js后,脚本出错的问题. 解决方式: 重写 ScriptBundle 的 GenerateBundleRespons ...

  10. UWP开发---嵌套DataTemplate&模板选择器

    对于Json结构体items不完全一致的情况下,在UWP平台是如何处理数据,并通过不同的模板选择,进行显示呢? 一,嵌套Json分析 1,结构 通过抓取index的API(点击请求API)获取到的js ...