来来来,快来围观那个Kotlin
这个世界怎么了?我都惊了。
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!
- HDUOJ----1181 变形课
- 正确的Win主机网站伪静态设置方法
- HDUOJ----(1084)What Is Your Grade?
- HDUOJ------(1272)小希的迷宫
- HDUOJ ---1269迷宫城堡
- HDUOJ---1213How Many Tables
- hduoj----(1033)Edge
- HDUOJ----(1031)Design T-Shirt
- HDUOJ----(1030)Delta-wave
- 身份切换脚本,免登入切换权限的利器
- HDUOJ---What Are You Talking About
- HDUOJ-----(1251)统计难题
- HDUOJ-----1541 Stars
- HDUOJ--------(1198)Farm Irrigation
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在r语言中使用GAM(广义相加模型)进行电力负荷时间序列分析
- R语言中的偏最小二乘回归PLS-DA
- R语言实现偏最小二乘回归法 partial least squares (PLS)回归
- 用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类
- python爬虫进行Web抓取LDA主题语义数据分析报告
- Python使用神经网络进行简单文本分类
- 在Python中自然语言处理生成词云WordCloud
- 使用Python中的ImageAI进行对象检测
- 适用于NLP自然语言处理的Python:使用Facebook FastText库
- R语言ISLR工资数据进行多项式回归和样条回归分析
- Python中用PyTorch机器学习分类预测银行客户流失模型
- R语言犯罪率回归模型报告Regression model on crimerate report
- leetcode树之从根到叶的二进制数之和
- 超冗余机器人运动控制:蛇形机器人 & 8自由度平面机械臂
- Linux Ubuntu / CentOS / MacOS 等系统安装使用 MTR 以及阅读分析 MTR 报告教程