수색…


통사론

  • 재미 이름 ( Params ) = ...
  • 재미 이름 ( Params ) {...}
  • 재미 이름 ( Params ) : 유형 {...}
  • 재미 < 유형 인수 > 이름 ( Params ) : 유형 {...}
  • 인라인 재미 이름 ( Params ) : 유형 {...}
  • { ArgName : ArgType -> ...}
  • { ArgName -> ...}
  • { ArgName -> ...}
  • {( ArgName : ArgType ) : 유형 -> ...}

매개 변수

매개 변수 세부
이름 함수 이름
Params 이름과 유형을 가진 함수에 주어진 값 : Name : Type
유형 함수의 반환 형식
유형 인수 일반 프로그래밍에 사용되는 매개 변수 유형 (반드시 반환 유형이 아님)
ArgName 함수에 주어진 값의 이름
ArgType ArgName에 대한 유형 지정자
ArgName 쉼표로 구분 된 ArgName 목록

기타 기능 가져 오기

"Lambda Functions"에서 볼 수 있듯이 함수는 다른 함수를 매개 변수로 사용할 수 있습니다. 다른 함수를 사용하는 함수를 선언하는 데 필요한 "함수 유형"은 다음과 같습니다.

# Takes no parameters and returns anything
() -> Any?

# Takes a string and an integer and returns ReturnType
(arg1: String, arg2: Int) -> ReturnType

예를 들어, vaguest 유형 () -> Any? , 람다 함수를 두 번 실행하는 함수를 선언한다.

fun twice(x: () -> Any?) {
    x(); x();
}

fun main() {
    twice {
        println("Foo")
    } # => Foo
      # => Foo
}

람다 함수

람다 함수는 일반적으로 함수 매개 변수로 작동하는 함수 호출 중에 생성되는 익명 함수입니다. 인수가 필요한 경우, 이러한 화살표 전에 넣어 - 그들은 {중괄호}로 표현을 둘러싼에 의해 선언 -> .

{ name: String ->
    "Your name is $name" //This is returned
}

람다 함수의 마지막 문장은 자동으로 반환 값입니다.

타입은 컴파일러가 타입을 추론 할 수있는 장소에 람다를 놓는 경우 선택 사항입니다.

여러 인수 :

{ argumentOne:String, argumentTwo:String ->
    "$argumentOne - $argumentTwo"
}

람다 함수가 오직 하나의 인자만을 필요로한다면, 인자리스트는 생략 될 수 있고 대신 하나의 인자가 it 사용하여 참조 될 수있다.

{ "Your name is $it" }

함수에 대한 유일한 인수가 람다 함수이면 함수 호출에서 괄호를 완전히 생략 할 수 있습니다.

# These are identical
listOf(1, 2, 3, 4).map { it + 2 }
listOf(1, 2, 3, 4).map({ it + 2 })

함수 참조

함수의 이름 앞에 :: 붙임으로써 실제로 함수를 호출하지 않고 함수를 참조 할 수 있습니다. 그런 다음 다른 함수를 매개 변수로 받아들이는 함수로 전달할 수 있습니다.

fun addTwo(x: Int) = x + 2
listOf(1, 2, 3, 4).map(::addTwo) # => [3, 4, 5, 6]

수신자가없는 함수는 (ParamTypeA, ParamTypeB, ...) -> ReturnType 으로 변환됩니다. 여기서 ParamTypeA , ParamTypeB ...는 함수 매개 변수의 유형이고`ReturnType1은 함수 반환 값의 유형입니다.

fun foo(p0: Foo0, p1: Foo1, p2: Foo2): Bar {
    //...
}
println(::foo::class.java.genericInterfaces[0]) 
// kotlin.jvm.functions.Function3<Foo0, Foo1, Foo2, Bar>
// Human readable type: (Foo0, Foo1, Foo2) -> Bar

리시버 (확장 기능이든 멤버 함수이든)를 사용하는 함수의 구문은 다릅니다. 이중 콜론 앞에 수신기의 유형 이름을 추가해야합니다.

class Foo
fun Foo.foo(p0: Foo0, p1: Foo1, p2: Foo2): Bar {
    //...
}
val ref = Foo::foo
println(ref::class.java.genericInterfaces[0]) 
// kotlin.jvm.functions.Function4<Foo, Foo0, Foo1, Foo2, Bar>
// Human readable type: (Foo, Foo0, Foo1, Foo2) -> Bar
// takes 4 parameters, with receiver as first and actual parameters following, in their order

// this function can't be called like an extension function, though
val ref = Foo::foo
Foo().ref(Foo0(), Foo1(), Foo2()) // compile error

class Bar {
    fun bar()
}
print(Bar::bar) // works on member functions, too.

그러나 함수의 수신자가 오브젝트 인 경우 수신자는 매개 변수 목록에서 생략됩니다. 이는 이러한 유형의 하나의 인스턴스이기 때문입니다.

object Foo
fun Foo.foo(p0: Foo0, p1: Foo1, p2: Foo2): Bar {
    //...
}
val ref = Foo::foo
println(ref::class.java.genericInterfaces[0]) 
// kotlin.jvm.functions.Function3<Foo0, Foo1, Foo2, Bar>
// Human readable type: (Foo0, Foo1, Foo2) -> Bar
// takes 3 parameters, receiver not needed

object Bar {
    fun bar()
}
print(Bar::bar) // works on member functions, too.

kotlin 1.1 이후로 함수 참조는 변수에 바인드 될 수 있으며, 이는 바운드 함수 참조 라고합니다.

1.1.0
fun makeList(last: String?): List<String> {
    val list = mutableListOf("a", "b", "c")
    last?.let(list::add)
    return list
}

이 예제는 한정 함수 참조가 작동하는 방법을 보여주기 위해서만 제공됩니다. 다른 모든 감각에서는 나쁜 습관입니다.

그래도 특별한 경우가 있습니다. 멤버로 선언 된 확장 함수는 참조 할 수 없습니다.

class Foo
class Bar {
    fun Foo.foo() {}
    val ref = Foo::foo // compile error
}

기본 기능

함수는 fun 키워드와 함수 이름 및 매개 변수를 사용하여 선언됩니다. 함수의 반환 유형을 지정할 수도 있습니다. 기본값은 Unit 입니다. 함수 본문은 중괄호 {} 묶습니다. 반환 유형이 Unit 이 아닌 경우 본문은 본문의 모든 종료 분기에 대해 return 문을 실행해야합니다.

fun sayMyName(name: String): String {
    return "Your name is $name" 
} 

동일한 약식 버전 :

fun sayMyName(name: String): String = "Your name is $name" 

그리고 유추 할 수 있기 때문에 유형을 생략 할 수 있습니다.

fun sayMyName(name: String) = "Your name is $name" 

속기 기능

함수가 하나의 식만 포함하면 중괄호를 생략하고 대신 변수 할당과 같은 equals를 사용할 수 있습니다. 표현식의 결과는 자동으로 리턴됩니다.

fun sayMyName(name: String): String = "Your name is $name" 

인라인 함수

함수는 inline 접두사를 사용하여 inline 으로 선언 할 수 있습니다.이 경우 함수는 호출되는 대신 C로 매크로처럼 동작합니다. 컴파일시 함수의 본문 코드로 대체됩니다. 이것은 일부 환경에서 성능상의 이점을 가져올 수 있으며 주로 lambda가 함수 매개 변수로 사용됩니다.

inline fun sayMyName(name: String) = "Your name is $name" 

C 매크로의 한 가지 차이점은 인라인 함수가 호출되는 범위에 액세스 할 수 없다는 점입니다.

inline fun sayMyName() = "Your name is $name"

fun main() {
    val name = "Foo"
    sayMyName() # => Unresolved reference: name
}

연산자 함수

Kotlin은 fixed symbolic representation ( + 또는 * 와 같은)과 고정 된 우선 순위를 가진 미리 정의 된 연산자 집합에 대한 구현을 제공 할 수있게 해줍니다. 연산자를 구현하기 위해 해당 유형에 대해 고정 된 이름의 멤버 함수 또는 확장 함수를 제공합니다. 과부하 연산자가 operator 수정 자로 표시되어야하는 함수 :

data class IntListWrapper (val wrapped: List<Int>) {
    operator fun get(position: Int): Int = wrapped[position]
}

val a = IntListWrapper(listOf(1, 2, 3))
a[1] // == 2

더 많은 연산자 함수는 여기 에서 찾을 수 있습니다 .



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow