基本要素:関数と変数
機能
関数定義のルール
- Functionキーワードは、
fun
関数を宣言するために使用されます - タイプと機能のパラメータは、このように、変数の宣言をその裏に書かれた名前を入力し返し、
- 機能は必ずしもクラスに入れて、ファイルの最外層に定義することができます
例:
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}
>>> println(max(1,2)) //打印结果:2
関数宣言キーワードのfun
関数名に続いて始まり、上記の例では関数の名前は括弧で囲まれたパラメータのリストが続き、最大です。それらの間のコロンで区切られた背中のリスト、続く型パラメータを返します。ノーリターン型の場合、タイプは結腸に直接戻すことができ、後に省略されています。
Kotlinでは、if
式の結果の値があります。関数の戻り値としてサンプルコードであれば(> b)は他の B、 Javaと同様の三項演算子で:(A> B)A: ?B. でKotlin if
の代わりに文の表現。差分式と式が値を有し、他の式の一部として使用することができること文、常に文コードブロックを囲み、独自の値を持っていない最上位の要素。
関数本体
上記のサンプルコードに簡単。それは関数の本体は、単一の式で構成されているので、我々は、機能の完全体としてこの表現を使用し、中括弧とreturn文を削除することができます。関数の本体は、中括弧で書かれている場合、我々は、関数がコード・ブロックを持っていることを言います。それが直接の表現を返した場合、関数は、式のボディを持つことになります。
fun max(a: Int, b: Int): Int = if (a > b) a else b
上記のコードは、さらに簡素化することが戻り値の型を保存することができます:
fun max(a: Int, b: Int) = if (a > b) a else b
なぜいくつかの関数は戻り値の型を宣言しない場合がありますか?静的型付け言語として、Kotlinは、それぞれの表現を必要とするよりも、あなたはコンパイラの種類は何が必要?実際には、各変数や式の型は、すべての関数は、戻り値の型を持っていました。しかし、式関数本体は、コンパイラは、体の発現の機能、および関数の戻り値の型など、そのタイプとして解析されます。これは、Kotlinの型推論です。(注:のみ、その戻り型とreturnステートメントを記述するために表示されなければならない機能ブロック本体の戻り値を省略することができる関数式のタイプを返します。)
変数
キーワードKotlinは、2つの変数を宣言しました。
- ヴァル(値から) - 不変参照。ヴァルは、変数が初期化後に再割り当てすることはできません宣言しました。これは、Javaのfinal変数に対応しています。
- (変数から)VAR - 参照変数。VaRは、使用する変数値を変更してもよいと宣言しました。この宣言は、Java変数の通常の(非最終)に相当します。
デフォルトでは、あなたがKotlinのすべての変数を宣言することvalのキーワード限りを使用する必要があり、唯一のVARは、必要なときに交換しました。
注:valを基準にもかかわらず、それ自体は不変であるが、それは可変とすることができるオブジェクトを指します。たとえば、次のコードは、完全に有効です。
val languages = arrayListOf("Java") //声明不可变引用
languages.add("Kotlin") //改变引用指向的对象
文字列テンプレート($)
「+」記号の例と同等のJavaのStringテンプレートKotlin:
val name = "World"
//下面两行代码是等效的
println("Hello "+name)
println("Hello $name")
>>> 打印结果:Hello World
クラスとプロパティ
カテゴリ
Javaのより簡潔なクラス宣言でKotlin。のは、以下の2つの例とまったく同じ、シンプルなJavaBeanクラスと比較してみましょうが、JavaやKotlinで宣言されました。
/* Java */
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
/* Kotlin */
class Person(val name: String)
プロパティ
Javaでは、フィールドとそのアクセサ(ゲッター、セッター)の組み合わせは、多くの場合、属性と呼ばれています。Kotlinでは、プロパティは、ファーストクラスの言語機能で、完全にフィールドとアクセサメソッド(getterメソッドとsetterメソッド)を置き換える、クラス内のプロパティを宣言して変数を宣言します。valとvarキーワードを使用します。ヴァル属性が読み取り専用(メソッドのみをゲッタリング)として宣言され、(getterメソッドとsetterメソッドを含む)変数var属性として宣言されています。
例:
class Person(val name: String, var age: Int) //Person类声明了一个只读的name属性与可变的age属性
fun main(args: Array<String>) {
val person = Person("xiaochao",24)
// person.name = "xiaochao" //编译不通过,val修饰,是只读的(只有getter,没有setter),不可修改
person.age = 25//编译通过,var修饰,是可变的,这里赋值是调用setter方法
println("name=${person.name},age=${person.age}")//这里取值是调用getter方法
}
>>> 打印结果:name=xiaochao,age=25
上記のコードは、コンストラクタやプロパティ呼び出しでステートメントを示していますが、Personクラスファイルで直接プロパティを宣言したい場合は、同じです。
class Person {
val name: String = "xiaochao"
var age: Int = 0
}
fun main(args: Array<String>) {
val person = Person()
// person.name = "hello world" //编译不通过,name是val修饰的,是只读的,不可修改
person.age = 18
println("name=${person.name},age=${person.age}")
}
>>> 打印结果:name=xiaochao,age=18
カスタムアクセサ(ゲッター、セッター)
それは彼らが正方形であるかどうかを確認することができ、あなたは、このような長方形を宣言したとします。矩形の同一の長さと幅かどうかをチェックすることにより、任意の時点で決定することができるように、(それが正方形であるかどうか)の情報を格納するために別々のフィールドを必要としません。
class Rectangle(val height:Int,val width:Int){
// val isSquare:Boolean
// //自定义getter方法,同理也可以自定义setter方法,不过要自定义setter方法则属性必须声明为var类型
// get() {
// return height==width
// }
//可以使用表达式函数体来简化
val isSquare:Boolean
get() = height==width
}
fun main(args: Array<String>) {
val rectangle = Rectangle(20,20)
println(rectangle.isSquare)
}
>>> 打印结果:true
列挙し、「いつ」
列挙型クラスの宣言
Javaのような、列挙リストの値ではありません:あなたは列挙するためのプロパティとメソッドを宣言することができます。
enum class Color(val r: Int, val g: Int, val b: Int) {
//下面每一个颜色都表示一个Color枚举类常量
RED(255, 0, 0), YELLOW(255, 255, 0),
ORANGE(255,165,0),INDIGO(75,0,130),
GREEN(0, 255, 0), BLUE(0, 0, 255);//这里必须要有分号
fun rgb() = (r * 256 + g) * 256 + b//给枚举类定义一个方法
}
fun main(args: Array<String>) {
println(Color.BLUE.rgb())
}
>>> 打印结果:255
基本的な使用時に
fun getMnemonic(color:Color){
when(color){
Color.RED -> println("red")
Color.BLUE -> {
println("blue")
}
Color.GREEN,Color.YELLOW -> println("green or yellow")
}
}
身体の関数として表現するとき
(他に支店が最終判断でなければならないときに、表現するとき、関数本体として使用してプラスすると、この場合の判定条件の色が列挙型であるため、定数宣言のすべてのタイプが他の無傷で、他の例を省略することができるが列挙されますあなたの隣)が他を追加する必要があります。
fun getMnemonic2(color:Color) =
when(color){
Color.RED -> "RED"
Color.BLUE -> {
"BLUE"
}
Color.GREEN,Color.YELLOW -> "GREEN or YELLOW"
//如果不加else则编译无法通过,因为Color下还有ORANGE与INDIGO没判断
else -> "other"
}
とき、引数なし
式は、その後、分岐条件は、任意のブール式であるときに、引数なしの場合。
fun mixOptimized(color1:Color,color2:Color) =
when{
(color1==Color.RED && color2==Color.YELLOW) ||
(color1==Color.YELLOW && color2==Color.RED) -> Color.ORANGE
(color1==Color.YELLOW && color2==Color.BLUE) ||
(color1==Color.BLUE && color2==Color.YELLOW) -> Color.GREEN
else -> throw Exception("Dirty color")
}
スマートコンバータ:マージ型チェックと変換
あなたには、いくつかの型の変数をチェックした場合、もはやあなたが使用のタイプをチェックして、あなたがそれを取ることができ、戻ってそれを変換する必要がありません。あなたは型変換を実行するために実際にはコンパイラが、私たちは、この動作はを通じてのみ、変数のインテリジェント変換、インテリジェントな変換と呼ばれる呼び出すis
変更を確認した後、効果的な場合と発生しなくなりました。例:
private val view:View? = null
fun test(){
if(view is TextView){
view.setText("这里view已经可以当成TextView使用")
}
}
インテリジェント変換is
キーワードを表現するためには、ここにあるis
Javaの同等のinstanceof
通じキャストas
キーの例を表すために:
private val view:View? = null
fun test(){
val textview = view as TextView
textview.setText("强制转换")
}
forループ
ループのための基本的な使い方
for (i in 0..10) { //从0开始遍历到10
println(i)//0,1,2,3,4,5,6,7,8,9,10
}
私たちはループのための最も簡単な使用を見た上で、ループKotlin間隔の間隔を表す。..使用する演算子を表現している、それは間隔0-10のために上記のループを意味します。このコンセプト間隔に加えて、ループの更なるステップのためのKotlinは、コンセプトを必要とします。、例えば上記のコードのようなデフォルト値を、各サイクルの間隔の大きさを理解するための簡単なステップ、指定されたステップ・サイズが表示されていない場合、デフォルトは0から1つの増分サイクルのステップで10時間間隔で、我々はステップとして指定しました2、出力結果が0,2,4,6,8,10であろう。2刻みに進みます。以下のコードを見てください:
for (i in 0..10 step 2) {
println(i)//0,2,4,6,8,10
}
我々は10-0から減少したい場合は、どのようにそれを書くには?以下のコードを見てください:
for (i in 10 downTo 0) { //这里我们同样可以设置步长
println(i)
}
我々は、それはのは、書き込み用のループでKotlinの一種を見てみましょう、0-10をプリントアウトしますサイクルの範囲は上記0..10知っています:
for (i in 0 until 10){
println(i)//0,1,2,3,4,5,6,7,8,9
}
上記のことに注意してくださいuntil
と0..10この製剤の差until
だけ0から9まで、このようなアプローチプリントが、そして0..10 0-10印刷されています。
反復回数:間隔と数列
インターバル間隔が2つの値の間に本質的に2つの値は、通常数である:開始値、終了値。使用..
間隔を表すにオペレータを:
val oneToTen = 1..10
含有又は閉じKotlin間隔に注意し、第2の値は常に部分区間を意味します。
あなたは、最も基本的なもののループ反復の全ての値の範囲内の整数を行うことができます。あなたは区間内のすべての値を反復処理することができた場合、間隔は、このようなカラム数と呼ばれています。
ループ反復するマップの
val maps = TreeMap<Char, String>()
for (c in 'A'..'F') {
val value = Integer.toBinaryString(c.toInt() )//A-F的二进制值
maps[c] = value //c为键,value为值
}
for ((key, value) in maps) {
println("$key = $value")
}
//打印结果
A = 1000001
B = 1000010
C = 1000011
D = 1000100
E = 1000101
F = 1000110
チェックインするキーワードを使用し、設定範囲のメンバー
たとえば、次のように私は0,10 5の間で数字かどうかを確認したい、コードは次のとおりです。
fun main(args: Array<String>) {
println(testIn(5))//true
}
fun testIn(i:Int):Boolean{
//这里in可以取反,!in
return i in 0..10
}
別の例として、私はリストをチェックしたいリストなどに値が含まれている、それが中で確認することができ、以下のように、コードは次のとおりです。
fun main(args: Array<String>) {
println(testIn("xiaochao"))//true
}
fun testIn(name: String): Boolean {
val listdata = ArrayList<String>()
listdata.add("xiaochao")
listdata.add("xiaowang")
listdata.add("laowang")
return name in listdata
}
Kotlin例外
JavaでKotlin例外はあまり違いはありません。しかし、ときKotlinの使用try catch
時間が、それは式として使用することができます。
fun testException(str:String):Int{
val number = try{
Integer.parseInt(str)
}catch (e:NumberFormatException){
0
}
return number
}
fun main(args: Array<String>) {
println(testException("55")) //打印结果:55
println(testException("hello world")) //打印结果:0
}
概要
fun
キーワードは、関数を宣言するために使用します。val
キーワードとvar
キーワードは、変数や変数の読み取り専用変数を宣言するために使用されています。- 文字列のテンプレートを使用すると、文字列リンクの面倒なセットを回避するのに役立ちます。変数名の前に
$
接頭辞または${ }
発現に囲まれ、文字列の中に注入される値。 - 身近には
if
、式の戻り値です。 when
式は、Javaに似ている、switch
しかし、より強力な。- あなたがチェック変数は、いくつかのタイプを持っていた後、明示的にその型を変換する必要はありません:コンパイラが自動的にあなたが完全に役立つスマートスイッチを使用しています。
- やる-ながら、whileループは、Javaに似ている、のために、今より便利にリサイクルするため、あなたがマップ、または時間の主題の下で必要な反復の別のセットを反復処理する必要がある場合は特に。
- 簡潔な構文1..5は、範囲を作成します。間隔数列ループKotlin統一文法と抽象化の同じセットを可能にし、使用することもできる
in
クラウドアルゴリズムと!in
指定された範囲内の値か否かを確認するために演算子を。 - Kotlinは(関数の後に表示された例外をスローすなわちずに)例外を投げることができる関数を宣言する必要はありませ除いて例外処理でKotlinとJavaは、非常に似ています。