根据 from-java-to-kotlin 的学习笔记
null声明
1 2 String otherName; otherName = null ;
1 2 var otherName : String?otherName = null
空判断
1 2 3 if (text != null ) { int length = text.length(); }
1 2 3 4 5 text?.let { val length = text.length } val length = text?.length
数组初始化
1 2 3 byte [] data = new byte [200 ];int [] int_data = new int [100 ];String[] data_str = new String [100 ];
1 2 3 val data = ByteArray(200 )val int_data = IntArray(100 )val data_str = arrayOfNulls<String>(100 )
字符串拼接
1 2 3 String firstName = "Amit" ;String lastName = "Shekhar" ;String message = "My name is: " + firstName + " " + lastName;
1 2 3 val firstName = "Amit" val lastName = "Shekhar" val message = "My name is: $firstName $lastName "
换行
1 2 3 String text = "First Line\n" + "Second Line\n" + "Third Line" ;
1 2 3 4 5 val text = """ |First Line |Second Line |Third Line """ .trimMargin()
三元表达式
1 String text = x > 5 ? "x > 5" : "x <= 5" ;
1 2 3 val text = if (x > 5 ) "x > 5" else "x <= 5"
操作符
1 2 3 4 5 6 final int andResult = a & b;final int orResult = a | b;final int xorResult = a ^ b;final int rightShift = a >> 2 ;final int leftShift = a << 2 ;final int unsignedRightShift = a >>> 2 ;
1 2 3 4 5 6 val andResult = a and bval orResult = a or bval xorResult = a xor bval rightShift = a shr 2 val leftShift = a shl 2 val unsignedRightShift = a ushr 2
类型判断和转换 (声明式)
1 2 3 if (object instanceof Car) {} Car car = (Car) object;
1 2 3 if (object is Car) {} var car = object as Car
类型判断和转换 (隐式)
1 2 3 if (object instanceof Car) { Car car = (Car) object; }
1 2 3 if (object is Car) { var car = object }
多重条件
1 if (score >= 0 && score <= 300 ) { }
1 if (score in 0. .300 ) { }
更灵活的case语句
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 = 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" ; }
1 2 3 4 5 6 7 8 var score = var grade = when (score) { 9 , 10 -> "Excellent" in 6. .8 -> "Good" 4 , 5 -> "OK" in 1. .3 -> "Fail" else -> "Fail" }
for循环
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()) { }
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 0 step 2 ) { }for (item in collection) { }for ((key, value) in map) { }
更方便的集合操作
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" ); final List<Integer> listOfNumber = List.of(1 , 2 , 3 , 4 );final Map<Integer, String> keyValue = Map.of(1 , "Amit" , 2 , "Ali" , 3 , "Mindorks" );
1 2 3 4 val listOfNumber = listOf(1 , 2 , 3 , 4 )val keyValue = mapOf(1 to "Amit" , 2 to "Ali" , 3 to "Mindorks" )
遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 for (Car car : cars) { System.out.println(car.speed); } cars.forEach(car -> System.out.println(car.speed)); for (Car car : cars) { if (car.speed > 100 ) { System.out.println(car.speed); } } cars.stream().filter(car -> car.speed > 100 ).forEach(car -> System.out.println(car.speed));
1 2 3 4 5 6 cars.forEach { println(it.speed) } cars.filter { it.speed > 100 } .forEach { println(it.speed)}
方法定义
1 2 3 4 5 6 7 void doSomething () { } void doSomething (int ... numbers) { }
1 2 3 4 5 6 7 fun doSomething () { } fun doSomething (vararg numbers: Int ) { }
带返回值的方法
1 2 3 4 int getScore () { return score; }
1 2 3 4 5 6 7 8 fun getScore () : Int { return score } fun getScore () : Int = score
无结束符号
1 2 3 4 int getScore (int value) { return 2 * value; }
1 2 3 4 5 6 7 8 fun getScore (value: Int ) : Int { return 2 * value } fun getScore (value: Int ) : Int = 2 * value
constructor 构造器
1 2 3 4 5 6 7 8 9 10 11 public class Utils { private Utils () { } public static int getScore (int value) { return 2 * value; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Utils private constructor () { companion object { fun getScore (value: Int ) : Int { return 2 * value } } } object Utils { fun getScore (value: Int ) : Int { return 2 * value } }
继承
1 2 3 4 public class User extends Persion { }
1 2 3 class User : Persion () {}
实现接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class User implements Persion { @Override public void onName () { } } new Persion (){ @Override public void onName () { } }
1 2 3 4 5 6 7 class User : Persion { override fun onName () {} } object : Persion { override fun onName () {} }
Get Set 构造器
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 + '}' ; } }
1 2 data class Developer (val name: String, val age: Int )
原型扩展
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Utils { private Utils () { } public static int triple (int value) { return 3 * value; } } int result = Utils.triple(3 );
1 2 3 4 5 fun Int .triple () : Int { return this * 3 } var result = 3. triple()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public enum Direction { NORTH(1 ), SOUTH(2 ), WEST(3 ), EAST(4 ); int direction; Direction(int direction) { this .direction = direction; } public int getDirection () { return direction; } }
Kotlin1 2 3 4 5 6 enum class Direction (val direction: Int ) { NORTH(1 ), SOUTH(2 ), WEST(3 ), EAST(4 ); }
let内联函数
Kotlin1 2 3 4 5 val result = "testLet" .let { println(it.length) 1000 } println(result)
场景一: 最常用的场景就是使用let函数处理需要针对一个可null的对象统一做判空处理。 场景二: 然后就是需要去明确一个变量所处特定的作用域范围内可以使用
不用let
1 2 3 mVideoPlayer?.setVideoView(activity.course_video_view) mVideoPlayer?.setControllerView(activity.course_video_controller_view) mVideoPlayer?.setCurtainView(activity.course_video_curtain_view)
用let
1 2 3 4 5 mVideoPlayer?.let { it.setVideoView(activity.course_video_view) it.setControllerView(activity.course_video_controller_view) it.setCurtainView(activity.course_video_curtain_view) }
also内联函数 also函数和let差不多,also返回传入对象,let返回最后一行的值。
1 2 3 4 5 val result = "testAlso" .also { println(it.length) 1000 } println(result)
with内联函数 with函数是接收了两个参数,分别为T类型的对象和一个lambda函数块,所以with函数最原始样子:
1 2 3 4 val result = with(user, { println("my name is $name , I am $age years old, my phone number is $phoneNum " ) 1000 })
最后一行的 ‘1000’ 返回值赋值给 ‘result’
但是由于with函数最后一个参数是一个函数,可以把函数提到圆括号的外部,所以最终with函数的调用形式:
1 2 3 4 val result = with(user) { println("my name is $name , I am $age years old, my phone number is $phoneNum " ) 1000 }
使用场景: 适用于调用同一个类的多个方法时,可以省去类名重复,直接调用类的方法即可,经常用于Android中RecyclerView中onBinderViewHolder中,数据model的属性映射到UI上
1 2 3 4 5 6 7 8 9 10 11 12 13 @Override public void onBindViewHolder (ViewHolder holder, int position) { MyItem item = getItem(position); if (item == null ) { return ; } holder.tvTitle.setText(item.title); holder.tvDate.setText(item.date); holder.tvInfo.setText(item.info); holder.tvCount.setText(item.count); ... }
Kotlin1 2 3 4 5 6 7 8 9 10 11 override fun onBindViewHolder (holder: ViewHolder , position: Int ) { val item = getItem(position)?: return with(item){ holder.tvTitle.text = title holder.tvDate.text = date holder.tvInfo.text = info holder.tvCount.text = count ... } }
run内联函数 run函数实际上可以说是let和with两个函数的结合体,run函数只接收一个lambda函数为参数,以闭包形式返回,返回值为最后一行的值或者指定的return的表达式。
1 2 3 4 5 6 7 val user = User("Kotlin", 1, "1111111") val result = user.run { println("my name is $name, I am $age years old, my phone number is $phoneNum") 1000 } println("result: $result")
适用于let,with函数任何场景。因为run函数是let,with两个函数结合体,准确来说它弥补了let函数在函数体内必须使用it参数替代对象,在run函数中可以像with函数一样可以省略,直接访问实例的公有属性和方法,另一方面它弥补了with函数传入对象判空问题,在run函数中可以像let函数一样做判空处理。
Kotlin1 2 3 4 5 6 7 8 9 10 override fun onBindViewHolder (holder: ViewHolder , position: Int ) { getItem(position)?.run{ holder.tvTitle.text = title holder.tvDate.text = date holder.tvInfo.text = info holder.tvCount.text = count ... } }
apply内联函数 和run差不多,apply返回的是对象本身。 使用场景:实例化一个对象,对属性进行赋值