当前分类 / Kotlin / 总共9篇

由Java泛型看Kotlin的泛型

参考链接:

什么是泛型

泛型的目的是让我们写一套代码可以支持不同的数据类型,下面我们实现一个简单的集合。

class MyList{

    private int size;
    private Object[] elements = new Object[10];
    
    public void add(Object item) {
    	elements[size++]=item;
    }
    
    public Object get(int index) {
    	return elements[index];
    }
}

我们实现的集合可以添加任意类型的数据(因为Java中Object是所有类的超类)

MyList myList = new MyList();
myList.add("A");
myList.add(1);
System.out.println(myList.get(0));
System.out.println((String)myList.get(1));

但是这样的代码有着很大的缺陷,因为需要类型的强制转换,这种转换错误是在编译期间发现不了的,在Java 1.5之前是没有泛型的,就是这样做的。泛型同样可以实现这个需求,但是通过面向对象的多态特性避免了类型强转,而且在编译期间就能发现类型问题。

阅读更多

Android开发中Kotlin的扩展库及实现Parcelable

参考链接:

在使用Kotlin开发Android中我们可以使用安卓扩展库来方便Android开发。

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'   //扩展库

阅读更多

Kotlin开发Android的奇技淫巧记录

参考链接:《聊一聊Kotlin扩展函数run,with,let,also和apply的使用和区别》

前面几篇我们了解了kotlin的语法和概念的东西,接下来我们在实际使用中看看kotlin带给我们的惊喜。

扩展函数的利用

现象

先来看一段代码:

val avaliableTime: String?
avaliableTime = R.string.avaliable_time.resToString("3年")
println(avaliableTime)

其中 avaliable_time 资源的定义如下

<string name="avaliable_time">有效期%s</string>

最终打印结果为:有效期3年

上面这个特点就是Kotlin扩展函数带给我们的福利。

阅读更多

Kotlin中的object关键字

参考链接

Kotlin中使用object关键字来代替Java中的匿名内部类实现。

在Java中很多时候我们需要一个一次性对象,可以使用匿名内部类来实现,如下:

Thread thread = new Thread(){
    
    @Override
    public void run(){
        System.out.println("hello world");
    }
}

在Kotlin中也支持同样的写法:

val thread: Thread = object : Thread(){
    override fun run(){
        println("hello world")
    }
}

阅读更多

Kotlin的数据类型和集合

参考链接: 《Kotlin实战》

基本类型

在Kotlin中并不区分基本数据类型和包装类型,例如:

val i: Int = 1
val list: List<Int> = listOf(1, 2, 3)

fun showProgress(progress: Int){
    val percent = progress.coerceIn(0, 100)
}

大多数情况下Kotlin的Int类型会被编译成Java的基本数据类型,用作泛型类型参数的基本类型会被编译成Java的包装类型。

在Kotlin中的可空类型不能用Java的基本类型表示(例如:Int?、Boolean?),这个时候会被编译成对应的Java包装类型。

var list: List<Int> = listOf(1, 2, 3)

上面代码的listOf集合类的参数是泛型,所以会编译成java的包装类型,所以要高效的存储基本类型建议用数组来存储。

阅读更多

Kotlin的可空性

参考链接: 《Kotlin实战》

可空性是Kotlin的一个重要特性,可以帮助我们避免发生NullPointerException.

可空类型

int strLen(String s){
    return s.length();
}

上面的Java代码如果我们传入空参数就会导致NullPointerException.

但是,和上面等价含义的Kotlin语句在编译期就能标记出错误,如下:

fun strLen(s: String) = s.length

>>> strLen(null)
ERROR: Null can not be a value of non-null type String

函数参数被声明为String类型,所以必须包含一个非null的String实例,这样在Kotlin中就保证了不会在运行时抛出NullPointerException.

阅读更多

Kotlin中的by关键字

参考链接

装饰器模式

装饰器模式又名包装模式,来以对客户透明的方式(客户端并不觉得修饰前后的区别)扩展对象的功能,是继承关系的一种替代方案。

在装饰模式中的角色有:

  • 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
  • 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。
  • 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
  • 具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

阅读更多

Lambda编程

参考链接

Lambda 表达式本质上就是可以传递给其他函数一小段代码。

有了 Lambda 可以轻松地把通用代码结构抽取成函数库,Kotlin 标准库大量使用了它。

什么是Lambda

我们知道,对于一个 Java 变量,我们可以赋给其一个“值”。如果你想把“一块代码”赋给一个 Java 变量,应该怎么做呢?

在 Java 8 之前,这个是做不到的。但是 Java 8 问世之后,利用 Lambda 特性,就可以做到了。

aBlockOfCode = public void doSomeShit(String s){
    System.out.println(s);
}

简便写法

  1. public 和函数名是多余的,因为已经赋值给了 aBlockOfCode.
  2. 编译器可以自动判断参数类型和返回类型。
  3. 只有一行可以省略大括号。

    aBlockOfCode = (s) -> System.out.println(s);
    

这样我们就将一个代码块成功赋值给了变量,那么 aBlockOfCode 的类型是什么呢?

阅读更多

Kotlin语法初探

本文参考资料

引言

最近接手一个项目是用 IDE 把之前的 Java 代码转成了 Kotlin 的,索性现在就多花些时间来窥探一下 Kotlin,计划在接下来的开发中使用 Kotlin 来完成。

Kotlin应该怎么读

Kotlin 在 2016 年发布了其第一个稳定版本 v1.0,紧跟着在 2017 年的 Google I/O 大会就正式宣布被 Android 平台支持。

Kotlin 具有很多下一代编程语言,静态语言特性:如类型推断、多范式支持、可空性表达、扩展函数、模式匹配等。

其主要设计目标:

  • 创建一种兼容 Java 的语言
  • 让它比 Java 更安全,能够静态检测常见的陷阱。如:引用空指针
  • 让它比 Java 更简洁,通过支持 variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation 等实现。
  • 让它比最成熟的竞争对手 Scala 语言更加简单。

函数编程核心概念

头等函数

把函数当做值来使用,可以用变量保存它,把它当做参数传递,或者当做其他函数的返回值。

不可变性

使用不可变对象,创建后状态不能再变化。

表达式函数体

fun max(a:Int, b:Int): Int{
    return if(a > b) a else b
}

在kotlin中除了(for、do 和 do\while)以外大多数控制结构都是表达式。

fun max(a:Int, b:Int): Int = if(a > b) a else b

阅读更多