val sum: (Int, Int) -> Int = {x,y -> x+y}
(Int, Int)
: 파라미터 타입 ->Int
: 리턴 타입{}
: 반환식 fun <T> Collection<T>.joinToString(
separator: String = ", ",
prefix: String = "",
postfix: String = "",
transform: ((T) -> String)? = null//null이 될 수 있는 함수 타엡의 파라미터 선언
//transform: (T) -> String = { it.toString() } //default 값 처리
): String {
//함수식
}
transform: ((T) -> String)? = null
: null가능, 함수 내부에서 널인 경우에 대한 처리해야함transform: (T) -> String = { it.toString() }
: default 값 지정fun getShippingCostCalculator(
delivery: Delivery): (Order) -> Double //Double 이 리턴타입
{ // 함수를 반환하는 함수 선언
if (delivery == Delivery.EXPEDITED) { //상태값에 따라서 람다를 반환
return { order -> 6 + 2.1 * order.itemCount }
}
return { order -> 1.2 * order.itemCount } //상태값에 따라서 람다를 반환
}
//main
val calculator =
getShippingCostCalculator(Delivery.EXPEDITED) //반환받은 함수를 변수에 저장
//함수를!! 변수에!! 저장하는거임!!!
println("Shipping costs ${calculator(Order(3))}") //Shipping costs 12.3
//반환받은 함수를 호출
//함수를!! 변수가 아니라 함수를!! 호출하는 것!!!
fun List<SiteVisit>.averageDurationFor(predicate: (SiteVisit) -> Boolean) =
filter(predicate).map(SiteVisit::duration).average()
fun main(args: Array<String>) {
println(log.averageDurationFor {
it.os in setOf(OS.ANDROID, OS.IOS) })
println(log.averageDurationFor {
it.os == OS.IOS && it.path == "/signup" })
}
it.os in setOf(OS.ANDROID, OS.IOS)
자체를 파라미터로 보내는 것이 전략 패턴 방법임!코드 길이가 너무 커서 인라이닝을 하면 안되는 코드라면..
inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit {
//...
}
filter
함수 val people = listOf(Person("Alice", 29), Person("Bob", 31))
fun lookForAlice(people: List<Person>) {
people.forEach {
if (it.name == "Alice") {
println("Found!")
return //forEach를 return 하는 것이 아닌 가장 근처에 있는 람다 함수인 lookForAlice() 를 반환.
}
}
println("Alice is not found")
}
//main
lookForAlice(people) //Found! 출력후 종료
슨생님! forEach만 끝내고 싶으면요?!🥸
fun lookForAlice(people: List<Person>) {
people.forEach label@{
if (it.name == "Alice") return@label
}
println("Alice might be somewhere") //이번에는 요것이 출력됨!
}
//main
lookFocAlice(people) // Alice might be somewhere
label@
- return@label
로 return 할 위치를 지정@forEach
로만 명시해도 forEach return 가능!fun lookForAlice(people: List<Person>) {
people.forEach(fun (person) { //람다 식 대신 무명 함수를 사용
if (person.name == "Alice") return
//여기서 return 은 가장 가까운 함수를 가리키는데 이 위치에서 가장 가까운 함수는 무명 함수임
println("${person.name} is not Alice")
})
}