1. 文字列の連結
java:
String firstName = "Amit";String lastName = "Shekhar";String message = "My name is: "+ firstName + " " + lastName;
kotlin
val firstName = "Amit"val lastName = "Shekhar"val message = "My name is: $firstName $lastName"
2. 改行
• Java
String text = "First Line\n" +
"Second Line\n" +
"Third Line";
• Kotlin
val text = """ |First Line |Second Line |Third
3. 三項式
• Java
String text = x > 5 ? "x > 5" : "x <= 5";
• Kotlin
val text = if (x > 5)
"x > 5"
else "x <= 5"
4. オペレーター
• java
final int andResult = a & b;final int orResult = a | b;final int xorResult = a ^ b;finalintrightShift=a>>2;finalintleftShift =a<<2;finalintunsignedRightShift = a >>> 2;
• Kotlin
val andResult = a and bval orResult = a or bval xorResult = a xor bval rightShift = a shr 2val leftShift = a shl 2val unsignedRightShift = a ushr 2
5. 型判定と変換(宣言的)
• Java
if (object instanceof Car) {
Car car = (Car) object;}
• Kotlin
if (object is Car) {var car = object as Car}
6. 型判定と変換(暗黙的)
• Java
if (object instanceof Car) {
Car car = (Car) object;
}
• Kotlin
if (object is Car) {
var car = object // 聪明的转换
}
7. 文字列テンプレート
Kotlin 中引入了字符串模版,方便字符串的拼接,可以用$符号拼接变量和表达式
/** kotlin 字符串模版,可以用$符号拼接变量和表达式* */fun testString2() { val strings = arrayListOf("abc", "efd", "gfg")
println("First content is $strings")
println("First content is ${strings[0]}")
println("First content is ${if (strings.size > 0) strings[0] else "null"}")
/** Kotlin 中,美元符号$是特殊字符,在字符串中不能直接显示,必须经过转义,方法 1 是用反斜杠, 方法二是${'$'}* */fun testString3() {
println("First content is \$strings")
println("First content is ${'$'}strings")
}
8. 3 つの引用符
public void testString1() {
String str1 = "abc";
String str2 = "line1\n" +
"line2\n" +
"line3";
String js = "function myFunction()\n" +
"{\n" +
" document.getElementById(\"demo\").innerHTML=\"My First
JavaScript Function\";\n" +
"}";
System.out.println(str1);
System.out.println(str2);
System.out.println(js);
}
/** kotlin 对字符串的加强,三个引号"""中可以包含换行、反斜杠等等特殊字符* */fun testString() {
val str1 = "abc"
val str2 = """line1\n line2 line3 """ val js = """ function myFunction()
{ document.getElementById("demo").innerHTML="My First JavaScript
kotlin 除了有单个双引号的字符串,还对字符串的加强,引入了三个引号,"""中可以包含换
行、反斜杠等等特殊字符:
Function";
} """.trimIndent()
println(str1)
println(str2)
println(js)
}
9. let ステートメントにより、null 許容オブジェクトのペアへのアクセスが簡素化されます。
• let 関数のプロトタイプ:
inline fun <T, R> T.let(block: (T) -> R): R = block(this)
• let 関数のデフォルトは現在のオブジェクトをクロージャの it パラメータとして設定し、戻り値は関数の最後の行であるか、
return が指定されています。
上記のコードは、以下に示すように、?.let ステートメントを使用して実行することもできます。
/* * let ステートメントを通じて、?.let の後に空の場合は操作は行われず、空でない場合のみ操作が行われます。 、
次の let が実行されますoperate* */
user?.let {
it.name
it.age
it.toString()
}
let 文により、?.let 以降は空の場合は何もせず、空でない場合のみlet
以降の操作が実行されます。
10.Elvis 演算子?: NULL 値の処理を簡素化する
値が空の可能性がある場合、次のように null 値の処理が面倒になる可能性があります。
/** null 値の処理* */
fun testElvis(input: String?, user: User?) {
val a: Int?
if (input == null) {
a = -1
} else {
a = input?.length
}
if (user == null) {
var newOne = User()
newOne.save()
} else {
user.save()
}
}
エルビス演算子 ?: は上記の演算を簡素化することができ、?: 記号は記号の左側が空の場合にのみ次の処理を実行し、
空でない場合は何も処理しません。たとえば、?.let の逆に、2 行のコードを使用して上記の操作を簡素化できます。
/** * Elvis 演算子?: Null 値の処理を簡略化します*/
fun testElvis2(input: String?, user: User?) {
val b = input?.length ?: -1;
user?.save() ?: User().save()
}
11. Null 可能型と null 不可能な型
Java には、チェックされた例外とチェックされていない例外があります。NullPointerException はチェックされていない例外であり、NullPointerException を明示的にキャッチする必要がないことを意味します。多くの場合、実行時にプログラムが NullPointerException を報告してクラッシュする可能性があります。Kotlin は効率的で、安全な言語であるため、コンパイル段階で null ポインターの問題を明示的に検出しようとし、問題をコンパイル段階で維持して、プログラムをより堅牢にします。
• Kotlin の型は、? によって null 許容型と非 null 許容型に分類されます。代表者は空でも構いませんか?NULL不可を表します
fun testNullType() {
val a: String = "aa"
/* * a 是非空类型,下面的给 a 赋值为 null 将会编译不通过 * */
// a = null
a.length
/* * ?声明是可空类型,可以赋值为 null * */
var b: String? = "bb"
b = null
/* * b 是可空类型,直接访问可空类型将编译不通过,需要通过?.或者!!.来访问 * */
// b.length
b?.length
b!!.length
}
• Null 非許容型の場合: Null 許容可能オブジェクトを非 Null 許容型に直接代入すると、
コンパイル時に失敗します
。 • Null 許容型の場合: 合格しますか? この型にアクセスするときは直接アクセスがコンパイルできないことを宣言し、
?. or!!.
o ? を渡す必要があります。これは、型が空の場合は null を返し、後続の操作は実行されないことを意味します。空でない場合は、
対応するメソッドまたはプロパティにアクセスします o を返します
。これは、型が空の場合は NullPointerException がスローされ、空でない場合は、対応するメソッドまたはプロパティにアクセス
することをしたがって、これはごく少数の特定のシナリオでのみ使用されます。この記号は、
プログラムがこの例外ケースを処理せず、
Java コードと同様に NullPointerException をスローすることを意味します。また、次のコードをコード内に含めてはなりません。コードが
読みにくくなり、null ポインター例外が発生した場合、どこが空であるかをすぐに見つけることができなくなります。
/* * 不推荐这样的写法:链式的连续用!!. * */
val user = User()
user!!.name!!.subSequence(0,5)!!.length
null 許容型に対応するため、その型へのアクセスごとに ?.judgment が必要になります。
val user: User? = User()
/* * 每次访问都用用?.判断 * */
user?.name
user?.age
user?.toString()
但这样多了很多代码,kotlin 做了一些优化,
/* * 或者提前判断是否为空,如果不为空在这个分支里会自动转化为非空类型就可以直接访问了
* */
if (user != null) {
user.name
user.age
user.toString()
}
事前に if を使用して型が空であるかどうかを判定し、空でない場合はこのブランチ内で自動的に空でない型に変換され、直接アクセスできるようになります。