前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >来来来,快来围观那个Kotlin

来来来,快来围观那个Kotlin

作者头像
ImportSource
发布2018-04-03 13:47:00
1.2K0
发布2018-04-03 13:47:00
举报
文章被收录于专栏:ImportSourceImportSourceImportSource

这个世界怎么了?我都惊了。

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!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ImportSource 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档