두번째 장 (코 틀린 기준)

기본 요소 : 함수와 변수

기능

함수 정의 규칙

  • 기능 키워드는  fun 함수를 선언하는 데 사용됩니다
  • 종류 및 기능 매개 변수는 다음과 같이, 변수 선언의 뒷면에 쓰여진 이름을 입력 반환하고
  • 기능은 반드시 클래스에 넣어하지, 파일의 최 외층에서 정의 할 수 있습니다

예 :

fun max(a: Int, b: Int): Int {
  return if (a > b) a else b
}
>>> println(max(1,2))  //打印结果:2

함수 선언 키워드 fun 함수명 뒤에 시작 : 상기 예에서 함수의 이름은 괄호 안에 파라미터리스트이어서 최대이다. 그들 사이에 콜론으로 구분 후면 목록, 이어 타입 파라미터를 반환한다. 돌아올 수없는 유형 경우, 형식은 생략 나중에 대장에 직접 반환 할 수 있습니다.
코 틀린에서 if 발현의 결과 값이있다. 함수 반환 값으로서 샘플 코드의 경우 (a> b)는 사람의 B, 이는 자바와 유사한 삼원 연산자 : (a> b) A : ? B. 에 코 틀린 if 대신 문장의 표현. 차이의 표현과 표현에 값이, 또 다른 표현의 일부로서 사용될 수 있다는 것을 문, 항상 문 코드 블록을 둘러싸는, 자신의 값을 가지고 있지 최상위 요소입니다.

함수 본문

위의 예제 코드를 쉽게. 이 함수의 내용이 하나의 표현으로 구성되어 있기 때문에, 우리는 기능의 완전한 몸으로이 표현을 사용하고, 괄호 및 반환 문을 제거 할 수 있습니다. 함수의 몸이 괄호로 작성하는 경우, 우리는 함수가 코드 블록을 가지고 있다고 말한다. 그것은 직접적인 표현을 반환하는 경우, 함수는 식의 몸이있을 것이다.

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

왜 일부 기능은 반환 유형을 선언하지 않을 수 있습니다? 정적으로 입력 된 언어로, 코 틀린 각 표현을 필요로하는 것보다 컴파일러의 종류는 어떻게해야합니까? 사실, 각 변수의 종류와 식 가지며, 각 기능 타입을 반환. 그러나 식 기능 체는, 컴파일러는 신체의 표현의 함수와 함수의 리턴 형 등의 형태로 분석된다. 이 코 틀린 유형의 추론이다. (주 : 이들 반환형 및 리턴 명령문을 작성하는 표시해야하는 기능 블록 체의 반환 값으로서 생략 될 수 함수식의 타입을 반환한다.)

변수

키워드 코 틀린 두 개의 변수를 선언 :

  • (값)에서 발 - 불변 참조. 발은 변수가 초기화 후 재 할당 할 수 없습니다 선언했다. 그것은 자바의 마지막 변수에 해당합니다.
  • (가변)에서 VAR - 기준 변수. VAR 사용될 변수 값이 변경 될 수있다 선언. 이 선언은 자바 변수의 일반 (비 최종)에 해당한다.

기본적으로, 당신이 코 틀린 모든 변수를 선언 할 수 발 키워드만큼 사용해야 만 VAR은 필요시 교체했다.
주 : 브로 기준에도 불구하고 자신이 불변이지만, 가변 될 수있는 객체를 포인트. 예를 들어 다음 코드는 완벽하게 유효합니다 :

val languages = arrayListOf("Java") //声明不可变引用
languages.add("Kotlin") //改变引用指向的对象

문자열 템플릿 ($)

의 "+"기호 예제의 자바 동등한 문자열 템플릿 코 틀린 :

val name = "World"
//下面两行代码是等效的
println("Hello "+name)
println("Hello $name")

>>> 打印结果:Hello World

클래스 및 속성

범주

자바보다 더 간결 클래스 선언에서 코 틀린. 의는 다음과 같은 두 가지 예 정확히 상응하는 간단한 자바 빈즈 클래스와 비교하자,하지만 자바와 코 틀린에 선언했다.

/* 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)

재산

자바에서는 필드의 조합과 그 접근 (게터, 세터)는 종종 속성이라고합니다. 발 및 var 키워드를 사용 : 코 틀린에있는이 호텔은 완전히 클래스 속성을 선언에서 필드와 접근 방법 (getter 및 setter 메소드) 교체 등의 변수를 선언, 일류의 언어 기능입니다. 읽기 전용 (유일한 방법 터링) (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

열거하고 "때"

열거 형 클래스 선언

자바와 마찬가지로 열거 목록의 값이 아니라 : 당신은 속성과 열거 할 방법을 선언 할 수 있습니다.

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자바의 동등한instanceof

를 통해 캐스트 as키 예를 나타내는 :

private val view:View? = null
fun  test(){ 
    val textview = view as TextView 
    textview.setText("强制转换")
}

루프

루프의 기본 사용

for (i in 0..10) { //从0开始遍历到10
    println(i)//0,1,2,3,4,5,6,7,8,9,10
}

우리 코 틀린 간격의 간격을 나타내는 .. 사용 연산자 표현 루프 루프 단순한 사용을 반드시보다도 그 의미 간격 0-10에 대한 상기 루프. 이 개념 간격 이외에, 상기 반복 단계는 코 틀린 개념을 포함한다. 이러한 상기 코드 각주기 간격 디폴트의 크기를 간단하게 이해할 단계 크기가 표시되지 지정 단계는, 디폴트는 0 내지 하나 증분 사이클의 단계 (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)
}

우리는 그것의 쓰기에 대한 루프에서 코 틀린의 한 종류를 살펴 보자, 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를 인쇄한다.

반복 횟수 : 간격 시퀀스 번호

인터벌 간격이 두 값 사이에 본질적으로, 두 값은 보통 숫자 : 시작 값이 최종 값. 사용 .. 의 간격을 나타내는에 연산자를 :

val oneToTen = 1..10

코 틀린 간격 함유 닫혀 참고 번째 값은 항상 부 섹션을 의미한다.
당신은 가장 기본적인 것은 루프 반복의 모든 값의 범위에서 정수를 할 수 있습니다. 당신이 구간에있는 모든 값을 반복 할 수있는 경우, 간격은 열 수라고합니다.

루프 반복 맵

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
}

코 틀린 예외

자바 코 틀린 예외가 크게 다르지 않다. 그러나 코 틀린은의 사용하면 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
}

개요

  1. fun 키워드는 함수를 선언하는 데 사용됩니다. val 키워드 및 var 키워드는 변수와 변수 읽기 전용 변수를 선언하는 데 사용됩니다.
  2. 문자열 템플릿을 사용하면 문자열 링크의 성가신 세트를 방지합니다. 변수 이름 앞에 $ 접두사 또는 ${ } 식에 의해 둘러싸여 값 문자열로 주입된다.
  3. 친숙한는 if 식의 반환 값입니다.
  4. when 표현은 자바와 유사하다 switch 하지만 더 강력한.
  5. 당신은 체크 변수는 몇 가지 유형이 후 명시 적으로 유형을 변환 할 필요가 없습니다 : 컴파일러는 자동으로 완료 할 수 있도록 스마트 스위치를 사용합니다.
  6. 대한 동안 수행-동안 루프가 자바와 비슷하지만, 지금은지도, 또는 시간의 주제에 따라 요구되는 반복의 또 다른 세트를 반복해야 할 때 특히 더 편리한 재활용.
  7. 간결한 구문 1..5이 범위를 생성한다. 간격 수열은 루프 코 틀린 통합 문법 추상화 동일한 세트를 허용하고, 또한 사용될 수있다 in 구름 알고리즘 및 !in 체크 운영자 지정 범위 내의 값인지.
  8. 코 틀린은 (기능 후에 표시 예외를 throw 즉없이) 예외를 던질 수있는 함수를 선언 할 필요가 없습니다 제외하고 예외 처리에 코 틀린와 자바는 매우 유사하다.

추천

출처www.cnblogs.com/xxiaochao/p/11497217.html