这篇文章主要,接着快速上手Kotlin11招 第一期的补充

1. 如何println 输出

  • Java println 输出

    1
    2
    System.out.print("Amit Shekhar");
    System.out.println("Amit Shekhar");
  • 基本等价的 Kotlin

    1
    2
    print("Amit Shekhar")
    println("Amit Shekhar")

2. 如何取到字符长度

  • Java 取到字符长度

    1
    2
    3
    if(text != null){
    int length = text.length();
    }
  • Kotlin 取到字符长度 形式不同java

    1
    2
    3
    text?.let {
    val length = text.length
    }

3. 如何拼接字符串

  • Java 拼接字符用“+”链接字符,麻烦容易出错,反复双引号,代码很糟糕

    1
    2
    3
    String firstName = "Amit";
    String lastName = "Shekhar";
    String message = "My name is: " + firstName + " " + lastName;
  • 等价 Kotlin 就整洁很多 “$变量名” 或者${变量名} 添加需要插入字符位置

    1
    2
    3
    4
    val firstName = "Amit"
    val lastName = "Shekhar"
    val message = "My name is: $firstName $lastName"
    val message = "My name is: ${firstName} ${lastName}"

4. 如何类之间转换

  • Java 需要当前类实例 使用 关键字 “instanceof” 是否属于需要转换类 然后强制转换该类

    1
    2
    3
    if(object instanceof Car){
    }
    Car car = (Car) object;
  • Kotlin 等价 是 关键 “is” 是否属于需要转换 然后用 关键字 “as” 转换类

    1
    2
    3
    if (object is Car) {
    }
    var car = object as Car

5. 如何数字判断在范围内

  • Java

    1
    if(score >= 0 && score <= 300 ){}
  • Kotlin 同等 使用关键字 “in” 起始值..结束值

    1
    if (score in 0..300) { }

6. 如何使用分支条件

  • Java 使用 “switch” 关键字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    int score = // some score;
    String grade;
    switch (score) {
    case 10:
    case 9:
    grade = "Excellent";
    break;
    case 8:
    case 7:
    case 6:
    grade = "Good";
    break;
    case 5:
    case 4:
    grade = "Ok";
    break;
    case 3:
    case 2:
    case 1:
    grade = "Fail";
    break;
    default:
    grade = "Fail";
    }
  • Kotlin 使用 when 很多分支需要用相同的方式处理,则可以把多个分支条件放在一起,用逗号分隔:

    1
    2
    3
    4
    5
    6
    7
    8
    var score = // some score
    var grade = when (score) {
    9, 10 -> "Excellent"
    in 6..8 -> "Good"
    4, 5 -> "Ok"
    in 1..3 -> "Fail"
    else -> "Fail"
    }
  • when语法

7. for 循环差别

  • Java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (int i = 1; i <= 10 ; i++) { }
    for (int i = 1; i < 10 ; i++) { }
    for (int i = 10; i >= 0 ; i--) { }
    for (int i = 1; i <= 10 ; i+=2) { }
    for (int i = 10; i >= 0 ; i-=2) { }
    for (String item : collection) { }
    for (Map.Entry<String, String> entry: map.entrySet()) { }
  • Kotlin for 循环可以对任何提供迭代器(iterator)的对象进行遍历

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (i in 1..10) { }
    for (i in 1 until 10) { }
    for (i in 10 downTo 0) { }
    for (i in 1..10 step 2) {}
    for (i in 10 downTo 1 step 2) {}
    for (item in collection) {}
    for ((key, value) in map) {}

8. 集合操作差别

  • Java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    final List<Integer> listOfNumber = Arrays.asList(1, 2, 3, 4);
    final Map<Integer, String> keyValue = new HashMap<Integer, String>();
    map.put(1, "Amit");
    map.put(2, "Ali");
    map.put(3, "Mindorks");
    // Java 9
    final List<Integer> listOfNumber = List.of(1, 2, 3, 4);
    final Map<Integer, String> keyValue = Map.of(1, "Amit",
    2, "Ali",
    3, "Mindorks");
  • Kotlin

    1
    2
    3
    4
    val listOfNumber = listOf(1, 2, 3, 4)
    val keyValue = mapOf(1 to "Amit",
    2 to "Ali",
    3 to "Mindorks")

9. forEach 循环变化

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Java 7 and below
for (Car car : cars) {
System.out.println(car.speed);
}
// Java 8+
cars.forEach(car -> System.out.println(car.speed));
// Java 7 and below
for (Car car : cars) {
if(car.speed > 100) {
System.out.println(car.speed);
}
}
// Java 8+
cars.stream().filter(car -> car.speed > 100).forEach(car -> System.out.println(car.speed));

  • Kotlin for语法
    1
    2
    3
    4
    5
    cars.forEach {
    println(it.speed)
    }
    cars.filter { it.speed > 100 }
    .forEach { println(it.speed)}

10. 有返回值类型方法区别

  • Java 方法修改 void 需要返回 类型

    1
    2
    3
    4
    int getScore() {
    // logic here
    return score;
    }
  • Kotlin 不需要修改 方法结构 使用 “:” 需要返回类型

    1
    2
    3
    4
    5
    6
    7
    8
    fun getScore(): Int {
    // logic here
    return score
    }
    // as a single-expression function
    fun getScore(): Int = score

11. 实体类区别

  • Java 跟常规类没有差别,实体类代码量很多

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    public class Developer {
    private String name;
    private int age;
    public Developer(String name, int age) {
    this.name = name;
    this.age = age;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getAge() {
    return age;
    }
    public void setAge(int age) {
    this.age = age;
    }
    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Developer developer = (Developer) o;
    if (age != developer.age) return false;
    return name != null ? name.equals(developer.name) : developer.name == null;
    }
    @Override
    public int hashCode() {
    int result = name != null ? name.hashCode() : 0;
    result = 31 * result + age;
    return result;
    }
    @Override
    public String toString() {
    return "Developer{" +
    "name='" + name + '\'' +
    ", age=" + age +
    '}';
    }
    }
  • Kotlin 提供了 “data”关键字 数据实体类 大大降低代码量

    1
    data class Developer(var name: String, var age: Int)

12. 如何使使用单例模式

  • Java 当中: (建议使用)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /**
    * Created by yangc on 2017/6/9.
    * E-Mail:yangchaojiang@outlook.com
    * Deprecated: 定义一个私有的内部类,在第一次用这个嵌套类时,会创建一个实例。
    * 而类型为SingletonHolder的类,只有在Singleton.getInstance()中调用,
    * 由于私有的属性,他人无法使用SingleHolder,不
    * 调用Singleton.getInstance()就不会创建实例。
    * 优点:达到了lazy loading的效果,即按需创建实例
    */
    public class UserSingle {
    static UserSingle getInstance() {
    return Holder.userSingle;
    }
    // 定义一个私有的构造方法
    private UserSingle() {
    }
    private static class Holder {
    static final UserSingle userSingle = new UserSingle();
    }
    }
  • Kotlin 中: 关键字 object 这个类属于单例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class UserSingle private constructor() {
companion object {
@JvmStatic //java 访问
fun getInstance(): UserSingle {
return Holder.instance
}
}
private object Holder {
val instance = UserSingle()
}
}

单例模式 生对象更多的用途是用来创建一个单例类。

  • 如果只是简单的写,直接用伴生对象返回一个 val 修饰的外部类对象就可以了,
  • 但是更多的时候我们希望在类被调用的时候才去初始化他的对象。
  • 以下代码将线程安全问题交给虚拟机在静态内部类加载时处理,是一种推荐的写

13. 如何使使用回调函数

  • Java 当中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    textView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    }
    });
    textView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View v) {
    return false;
    }
    });
  • Kotlin 中:

1
2
3
4
5
6
7
8
9
10
11
12
13
//不使用参数 返回void
btnWrite.setOnClickListener { fileWrite() }
//使用参数 返回void
btnWrite.setOnClickListener {
view->
fileWrite(c.getid()
}
//使用参数 返回void
btnWrite.setOnClickListener {
view->
fileWrite(c.getid()
true
}

在 kotlin 使用lambda 表达式,不用new 匿名内部类进行回调 {}括号中,直接添加代码

14. 如何使用 findViewById

  • 在java中 或者使用著名butterknife 注解控件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TextView textView;
    ....
    textView = (TextView) findViewById(R.id.textView);
    .....
    //或者
    @BindView(R.id.textView)
    TextView textView;
    @BindView(R.id.textView)
    TextView textView;
    @BindView(R.id.textView)
    TextView textView;
    ....
  • java在复杂布局占用代码行数通常是。。。这个说出来

  • 在kotlin 中

    1
    2
    3
    4
    5
    6
    7
    lateinit var textView :TextView
    lateinit var textView2 :TextView
    ...
    //实例化时
    textView=findViewById(R.id.textView) as TextView
    textView2=findViewById(R.id.textView2) as TextView

    好像没什么,只是转换形式的变了,实现还是一样。
    别急kotlin 提供不用findViewVById 就可以得到控件实例,进行赋值等操作
    共两步骤

    • 1。你的app 的build.gradle 文件里加入 代码如下:
1
apply plugin: 'kotlin-android-extensions'
  • 2 在你使用acitvity 或者fragment 等类 添加引用 import;
    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import kotlinx.android.synthetic.main.activity_main.*
    class MainActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    textView.setText("赋值")
    textView.text="赋值"
    ]
    }

直接控件id名称实例的操作 不需要在 findViewBYid 实例化和声明
“kotlinx.android.synthetic.main”固定 的
后面是就是activity语对应布局名称
在复杂布局的也不用写一堆声明控件和findViewById 等无脑代码

最后更新: 2017年07月14日 12:56

原始链接: http://yangchaojiang.cn/2017/07/14/kotlin-blog-2/