这个世界怎么了?我都惊了。
kotlin来了,就因为Google背书了一哈,你们就无条件的沸腾了。
这年头出来了所谓语言还少吗?
三天两头搞些新花样。
你们就不能安心的团结在java或者其他世界最好语言的周围长期演进吗?
说好的长期演进呢。
说好的开源呢?
你们这种三天两头自立门户搞出一门新语言真的是开源精神?
你这不是变相的bi源吗?
一个相同的功能愣是在这个世界上存在n版。
这不是重复造轮子吗。
说好的不重复造轮子怎么就变了。
当初你c#说自己事件机制碉堡了,点一下进去就可以写action了。我信了。
屁颠屁颠写了一段时间onclick。
结果有一天你忽然冒出来个,,.net mvc。
看到mvc我就怒了,说好的怎么就变了
怎么开始模仿java了。
当初你生产出iPhone5小屏幕,看着别家屏幕一个个比脸大。你们还美其名曰
我们之所以设计这么小是因为方便单手操作。
然后,6你就和别家变得一样大了。
spring当初说好的xml配置。说XML
配置有多好,可以让你灵活配置和修改类。
还愣是整出个英文词叫hard code。
后来你们又说约定大于配置,这些我都信了。
再后来直接又回到了写代码配置。
这不是hard code吗?说好的优雅呢。
你看啊,这是hard code。你再看,hard code everywhere,嗯哼。。。
前几年你们吹云计算,结果每家最后就只搞出来一个网盘。
说好的怎么就变了呢。一双塑料凉鞋如今怎么变得这么贵,这不是就是我小时候穿过的那种凉鞋吗?
说好的现代风呢。怎么现在开始穿软料裤了?
这不是我小时候我妈穿的那种软料裤嘛。
你们还穿喇叭裤。99年,2000年男女都穿的不就是这种喇叭裤嘛?
当年我也花25买了一条,像下面这样:
听说某视要搞共享电视,我还以为古总以后要去隔壁老王家看电视,一看描述就是搞些内容上去,真的是故事讲多了容易出事故。
好,接下来我们学习下kotlin这门语言。
(一个kotlin版spring boot访问mongodb的栗子)
我们来逐个学习下kotlin的语法:
1、pacakage:把分号去掉就可以了,算是减少一个标点的代码量
package com.importsource.spring.samples.kotlin
2、import
import org.springframework.boot.CommandLineRunner
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.data.annotation.Id
import org.springframework.data.mongodb.core.mapping.Document
import org.springframework.data.mongodb.repository.MongoRepository
import org.springframework.data.mongodb.repository.Query
import java.util.stream.Stream
和java的一样,只要把分号去掉就可以了。
3、annotation
@SpringBootApplication
注解还是那个注解,和java没变。
4、类、构造传入、实现接口一锅端:
open class BootifulKotlinApplication(val personRepository : PersonRepository):CommandLineRunner{
override fun run(vararg p0: String?) {
personRepository.deleteAll()
Stream.of("leo,messi","c,ronaldo","l,james","k,bryant","armani,nymar","luis,enrique").map { fn->fn.split(",")
}.forEach{tpl -> personRepository.save(Person(tpl[0],tpl[1]))}
personRepository.all().forEach{println(it)}
}
}
5、public 改为 open。
open class BootifulKotlinApplication{}
6、 直接构造传入参数personRepository,变量前面加个val就表示个变量,具体指定类型放在冒号后面:
open class BootifulKotlinApplication
(val personRepository : PersonRepository)
:CommandLineRunner{
override fun run(vararg p0: String?) {
}
}
7、实现接口,依然是万能的冒号:
open class Xxxx
:CommandLineRunner{
override fun run(vararg p0: String?) {
}
}
8、java的方法这里叫function。kotlin有个特点就是梭梭就是干。前缀是啥就是啥,前缀是val表示变量,前缀是vararg那么很明显就是可变参数。前缀加个override就是实现和覆盖,就是这么直接:
override fun run(vararg p0: String?) {
}
你点进去这个接口会发现依然是java接口:
public interface CommandLineRunner {
void run(String... var1) throws Exception;
}
这个理解起来很简单,红楼梦你翻译成韩语也是红楼梦。你大爷还是你大爷。kotlin就是那个k语版java。所以java的现有所有的jar,在kotlin里边一样用,只需要引入依赖就是了。
9、刚才在类头上就已传入了personRepository了。所以在run function里二话不说就是开始使用了,调用还是一如既往的粗暴,把分号干掉就可以了,然后直接来个stream,遇见list马上打点“.”弹出forEach就搞一个循环,然后循环里直接来item,然后就是一个横杠箭头向右就开始操作具体的item。这样代码行数一样子又减少了许多:
override fun run(vararg p0: String?) {
personRepository.deleteAll()
Stream.of("leo,messi","c,ronaldo","l,james","k,bryant","armani,nymar","luis,enrique").map { fn->fn.split(",")
}.forEach{tpl -> personRepository.save(Person(tpl[0],tpl[1]))}
personRepository.all().forEach{println(it)}
}
对了,打印不再加前面system.out了,在kotlin看来这都是重复多余,直接println就是了。
10、main
你也许在想,spring boot main去哪里了?
别急,k语言中,就是这么任性,main可以直接放在open class 大括号之外:
fun main(args: Array<String>) {
SpringApplication.run(BootifulKotlinApplication::class.java, *args)
}
他可能想,反正放在哪里你都是那个main。放哪里不是放,干嘛非得放在大括号里边。
.class:现在是变成两个冒号"::",然后后面加class.java。万能的冒号,如果一个冒号没有解决问题,那么请用两个冒号。
数组的类型表示:以前是String[] xx ,现在是反过来:xxx:Array<String>。
[]变成Array,然后类型用尖角号来指定。一个目的,说啥就是啥,单词能说清楚的就不用约定和各种符号。
使用数组:要加个*。
11、dao代码。
interface PersonRepository:MongoRepository<Person,String>{
@Query("{}")
fun all(): Stream<Person>
}
(1)、还是万能的冒号,当你搞不清楚接下来要写什么时,请你想到冒号。这不,连functiion的返回值类型指定都通过冒号来搞。
fun all(): Stream<Person>
12、entity
@Document
data class Person(var first: String?=null,
var last: String?=null,
@Id var id:String?=null
)
(1)、注解还是那个注解,用@,没变。
(2)、在类前面加个data就表示这是用来存放数据的。
(3)、构造函数什么的直接加在类后边。
(4)、别写getter、setter了,自动为你生成。
(5)、属性。你也许纳闷,不是说好的val吗,怎么又变成var了。区别很简单:val是只读的;var是可以被修改的,可变的。你就这样理解把val就是value,var就是variable。
(6)、?=。这个很明显是传默认值的。就这么简单粗暴。
至于其他的if else for 等等基本语法,相信你通过cv大法搞一次基本就可以熟练使用了。这年头,你写的各种语言的helloworld还少吗。
我们再来看看pom中的依赖吧。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jre8</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
发现上面的和之前java spring boot不一样的依赖也就两个:
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jre8</artifactId>
<version>${kotlin.version}</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
<version>${kotlin.version}</version>
</dependency>
这两个依赖是什么呢?就是负责把jre8翻译了一个k版,姑且就这么认为吧。
再来看看build:
<build>
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<configuration>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
<jvmTarget>1.8</jvmTarget>
</configuration>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
发现加了个kotlin的maven插件。这样maven就可以编译我们刚才写的那个bootiful kotilin了。
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
然后再指定下source目录和test source目录:
<sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
来来来,继续围观kotlin!