Android开发经验谈Android开发Kotlin编程

Kotlin总结

2019-07-15  本文已影响8人  仕明同学
狗熊镇楼
kotlin爸爸
data class Customer(val name: String, val email: String, val company: String)

使用 lambda 表达式来过滤列表:
val positiveNumbers = list.filter { it > 0 }

想要单例?创建一个 object 就可以了:
object ThisIsASingleton { val companyName: String = "JetBrains" }

彻底告别那些烦人的 NullPointerException——著名的十亿美金的错误

编译错误?为什么呢?因为定义的时候就告诉他不能为null了,是个String类型

var output: String
output = null   // 编译错误

Kotlin 可以保护你避免对可空类型的误操作

val name: String? = null    // 可控类型
println(name.length())      // 编译错误

并且如果你检查类型是正确的,编译器会为你做自动类型转换

fun calculateTotal(obj: Any) {
    if (obj is Invoice)
        obj.calculateTotal()
}
   Flowable
            .fromCallable {
                Thread.sleep(1000) //  模仿高开销的计算
                "Done"
            }
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.single())
            .subscribe(::println, Throwable::printStackTrace)

无论是 JVM 还是 JavaScript 目标平台,都可用 Kotlin 写代码然后部署到你想要的地方

import kotlin.browser.window

fun onLoad() {
    window.document.body!!.innerHTML += "<br/>Hello, Kotlin!"
}

Kotlin主要用于:使用 Kotlin 进行服务器端开发、使用 Kotlin 进行 Android 开发、使用 Kotlin 进行 Kotlin JavaScript 开发、Kotlin/Native 用于原生开发

Kotlin 非常适合开发 Android 应用程序,将现代语言的所有优势带入 Android 平台而不会引入任何新的限制

  • 兼容性
    Kotlin 与 JDK 6 完全兼容,保障了 Kotlin 应用程序可以在较旧的 Android 设备上运行而无任何问题。Kotlin 工具在 Android Studio 中会完全支持,并且兼容 Android 构建系统
  • 性能
    由于非常相似的字节码结构,Kotlin 应用程序的运行速度与 Java 类似。 随着 Kotlin 对内联函数的支持,使用 lambda 表达式的代码通常比用 Java 写的代码运行得更快。
  • 互操作性
    Kotlin 可与 Java 进行 100% 的互操作,允许在 Kotlin 应用程序中使用所有现有的 Android 库 。这包括注解处理,所以数据绑定与 Dagger 也是一样
  • 占用
    Kotlin 具有非常紧凑的运行时库,可以通过使用 ProGuard 进一步减少,Kotlin 运行时只增加几百个方法以及 .apk 文件不到 100K 大小。
  • 编译时长
    Kotlin 支持高效的增量编译,所以对于清理构建会有额外的开销,增量构建通常与 Java 一样快或者更快

//定义a为int类型的变量,值为1
val a:Int=1
//自动检查b为int的类型
val b=2

使用var(全称为variable,即变量)关键字定义变量。

//定义x的值为5
var x = 5 
//修改x的值为1
x=1
fun sum(a: Int, b: Int): Int {
    return a + b
}

什么是top-level的函数:在Java中必须有类才有main函数,在kotlin中,main函数可以不依赖于类

fun main(args: Array<String>) {
    println("shiming  我是 topLevel 函数")
}

在使用kotlin的写安卓的时候,main函数不会主动的运行,所以基本上不会使用到这个方法

使用单利:使用object来声明一个类时,表示这是一个单例类,一般和lazy想结合这使用

    fun String.lastChar(): Char = get(length - 1)

利用函数扩展,Kotlin也支持运算符重载


fun main(args: Array<String>) { 
        val list = listOf("args: ", *args)
        println(list)
    }
  class User(
        val id:      Int, 
        val name:    String, 
        val address: String) 
    { 

        fun saveUser(user: User) {
           fun validate(user: User, value: String, fieldName: String) {
               if (value.isEmpty()) {
                   throw IllegalArgumentException(
                      "Can't save user ${user.id}: empty $fieldName")
               }
           }

           validate(user, user.name, "Name") 
           validate(user, user.address, "Address")
           // Save user to the database
        }
    }
  for ((index, element) in collection.withIndex()) { 
         println("$index: $element")
    }
 // 不需要open。默认就是的
    abstract class Animated {

        // This virtual function is already open by default as well
        abstract fun animate()
  
        open fun stopAnimating() { }

        fun animateTwice() { }
    }
  • public:全局可见。此为默认的类型。
  • internal:在当前模块中可见
  • protected:在当前类别的一级子类中可见,如果子类再被继承,则在下一级子类中不可见。
  • private:在当前类别中可见。
class User(
         val nickname: String, 
         val isSubscribed: Boolean = true) 
     {
         ...
     }

Kotlin 的二级构造函数更类似于 C++, C#, 和 Java。

 class MyButton : View {

        // Constructor #1 
        constructor(ctx: Context) : super(ctx) { 
            // ... 
        } 
  
        // Constructor #2
        constructor(ctx: Context, attr: AttributeSet) : super(ctx, attr) { 
            // ... 
        }
    }
 fun Activity.showAreYouSureAlert(process: () -> Unit) {
            alert(
              title   = "Are you sure?",
              message = "Are you really sure?") 
            {
              positiveButton("Yes") { process() }
              negativeButton("No") { cancel() }
            }
        }
$ kotlinc-jvm
type :help for help; :quit for quit
>>> 2+2
4
>>> println("Welcome to the Kotlin Shell")
Welcome to the Kotlin Shell
>>>
// list_folders.kts
import java.io.File
val folders = File(args[0]).listFiles { file -> file.isDirectory() }
folders?.forEach { folder -> println(folder) }

为了运行Kotlin 脚本,我们在运行编译器时再加上-script选项。

$ kotlinc -script list_folders.kts "path_to_folder_to_inspect"
fun sayHello(maybe: String?, neverNull: Int) {
   // use of elvis operator
   val name: String = maybe ?: "stranger"
   println("Hello $name")
}

使用安全导引(safe navigation)运算符:

foo()?.bar()?.baz()
  fun executeLambda(f: (s: String) -> Unit) {
    f("lambda")
  }

Lambdas 可用大括弧{ } 来定义。如果lambda 夹带参数,他们可定义在大括弧内,并以->运算符区隔。

  val l = { c : Any? -> println(c) }
  val l2 = { print("no parameters") }
  • 总结
  • Kotlin学习Demo
  • 一个kotlin的类可以有很多的init方法,init方法肯定会执行,这个类在初始化的时候,但是main不一定,main方法是top-level函数,可以不依托类
  • kotlin中的init和main可以和Go对比,其实都是差不多的
  • 运行在JVM上的语言:Clojure、Groovy(作为Java平台的脚本语言使用)、Java、Kotlin、Scala
  • 运行在Android上的:Java、Kotlin、C++
qrcode_for_gh_9bd8e7d248a8_258.jpg
上一篇 下一篇

猜你喜欢

热点阅读