Kotlin学習ノート(一)


学習参考文書:http://www.kotlinlang.org/docs/reference/basic-syntax.html
名前を包む
パッケージ名はファイルの一番上にあります。
package my.demo
import java.util.*
ディレクトリとパッケージにマッチする必要はありません。ソースファイルは任意のファイルシステムに置くことができます。See Packages.ソースファイルは、1つのパケットの開始を宣言するために使用できます。
package foo.bar

fun baz() {}

class Goo {}

// ...
以上のソースファイルの内容(クラスと関数を含む)はパッケージの声明に含まれています。したがって、上記の例では、baz()のフルネームはfoo.bar.baz、Goo類のフルネームはfoo.bar.Gooです。ステートメントパッケージがない場合、ソースファイルの内容は名前のない「default」パッケージに属します。
Imports
デフォルトのimport以外に、各ファイルには独自のimportコマンドが含まれます。
私たちはパッケージ名を導入することができます。このパッケージに導入されたすべてのコンテンツを含みます。(クラス、関数など)
import foo.Bar //
このように導入することもできます。
import foo.* // 
import foo.Bar // Bar is accessible
import bar.Bar as bBar // bBar stands for 'bar.Bar'
Visibility of Top-level Declarations
トップステートメントがプライベートである場合、その文書はプライベートです。
宣言関数
戻り値の関数は次の例を見てください。この関数sumには2つのIntパラメータがあり、関数の戻り値の種類はIntです。
fun sum(a: Int, b: Int): Int {
  return a + b
}
関数を表式で表し、戻り値の種類として表現します。
fun sum(a: Int, b: Int) = a + b
戻り値のない関数
以下の関数は、戻り値がない関数、または関数は、実際の意味がない値を返します。UnitとJavaのvoid機能は似ています。
fun printSum(a: Int, b: Int): Unit {
  print(a + b)
}
キーユニットは無視できます。書きません。
public fun printSum(a: Int, b: Int) {
  print(a + b)
}
See Funtions.
ローカル変数を宣言
一回だけローカル変数を割り当てます。
val a: Int = 1
val b = 1 // Int     
val c: Int //             
c = 1 //   
変数
var x = 5 // `Int` type is inferred
x += 1
See also Propties And Fields.
文字列テンプレートを使う
fun main(args: Array<String>) {
  if (args.size() == 0) return

  print("First argument: ${args[0]}")
}
See String templates.
条件式を使う
fun max(a: Int, b: Int): Int {
  if (a > b)
    return a
  else
    return b
}
表式を使うこともできます。
fun max(a: Int, b: Int) = if (a > b) a else b
See if-expressions.
空の値と確認nullを使う
1つの参照値は、値がNullの場合、nullであるかどうかを詳細に示す必要があります。以下の例では、この関数が整数で返されない場合、Nullが返されます。
fun parseInt(str: String): Int? {
  // ...
}
戻り値を使うと空の関数になります。
fun main(args: Array<String>) {
  if (args.size() < 2) {
    print("Two integers expected")
    return
  }

  val x = parseInt(args[0])
  val y = parseInt(args[1])

  // Using `x * y` yields error because they may hold nulls. x y   Null    
  if (x != null && y != null) {
    // x and y are automatically cast to non-nullable after null check     Null  ,x y           
    print(x * y)
  }
}
あるいはこのように書きます
 // ...
  if (x == null) {
    print("Wrong number format in '${args[0]}'")
    return
  }
  if (y == null) {
    print("Wrong number format in '${args[1]}'")
    return
  }

  // x and y are automatically cast to non-nullable after null check
  print(x * y)
See Null-safety.
タイプ検出用法と自動タイプ変換
式がタイプのインスタンスである場合は、タイプチェックです。可変ではないローカル変数または属性が特定のタイプの場合、タイプ変換は不要です。
fun getStringLength(obj: Any): Int? {
  if (obj is String) {
    // `obj` is automatically cast to `String` in this branch
    return obj.length
  }

  // `obj` is still of type `Any` outside of the type-checked branch
  return null
}
備考:この関数はnullまたは整数に戻ります。これはJavaより柔軟です。戻りタイプはこのように書きました。
fun getStringLength(obj: Any): Int? {
  if (obj !is String)
    return null

  // `obj` is automatically cast to `String` in this branch
  return obj.length
}
or even
fun getStringLength(obj: Any): Int? {
  // `obj` is automatically cast to `String` on the right-hand side of `&&`
  if (obj is String && obj.length > 0)
    return obj.length

  return null
}
See Class and Type casts.
ループを使う
fun main(args: Array<String>) {
  for (arg in args)
    print(arg)
}
備考:for循環使用キーワードInt?が行う
あるいはこのように書いてもいいです。
for (i in args.indices)
  print(args[i])
See for loop.
条件式
fun cases(obj: Any) {
  when (obj) {
    1 -> print("One")
    "Hello" -> print("Greeting")
    is Long -> print("Long")
    !is String -> print("Not a string")
    else -> print("Unknown")
  }
}
備考:この条件式は比較的柔軟で、整数、文字列の値を比較できます。タイプを判断することもできます。また、デフォルトのelseもあります。
数値の使用範囲
以下の操作は、数値が数値範囲内にあるかどうかを確認することです。
if (x in 1..y-1)
  print("OK")
数値が数値の範囲外にあるかどうかを確認します。
if (x !in 0..array.lastIndex)
  print("Out")
数値範囲を巡回:
for (x in 1..5)
  print(x)
See Ranges.
集合の使い方
集合を巡回:
for (name in names)
  println(name)
次の操作は、セットにオブジェクトが含まれているかどうかを確認します。
if (text in names) // names.contains(text) is called
  print("Yes")
関数でフィルタリングし、Mapセットを巡回します。
names.filter { it.startsWith("A") }.sortBy { it }.map { it.toUpperCase() }.forEach { print(it) 
}
See Higher-order functions and Lambands.