package org.example.Functions  
  
//다음과 같은 함수가 있을 때  
//fun uppercaseString(text: String): String {  
//    return text.uppercase()  
//}  
//아래처럼 짧게 쓸 수 있음  
//fun main() {  
//    val upperCaseString = { text: String -> text.uppercase() }  
//    println(upperCaseString("hello"))  
//    // HELLO  
//}  
  
//람다 규칙  
//람다식은 중괄호 ({) 안에 작성된다.  
//매개변수 뒤에 ->를 쓴다.  
//-> 뒤에 함수 본문이 온다  
//매개변수가 없는 경우엔 ->를 쓰지 않아도 된다.  
  
//사용법  
//1. 람다식은 다른 함수의 매개변수로 전달할 수 있다.  
//2. 함수에서 람다식을 반환할 수 있다.  
//3. 람다식만 호출해서 쓸 수 있다.  
  
//1번 사용법의 예시  
//fun main() {  
//    val numbers = listOf(1, -2, 3, -4, 5, -6);  
//  
//    val positives = numbers.filter({ x -> x>0});  
//  
//    val isNegative  = {x: Int -> x < 0};  
//    val negatives = numbers.filter(isNegative);  
//  
//    println(positives);  
//    println(negatives);  
//}  
  
//함수 타입  
//함수의 타입으로 함수를 지정할 수 있음  
//아래 모양으로 작성하면 됨  
//매개변수가 없으면 괄호를 비워두면 됨  
//(파라미터 타입) -> 함수 반환 타입  
//(String) -> Int  
  
//val upperCaseString: (String) -> String = { text -> text.uppercase() }  
//  
//fun main() {  
//    println(upperCaseString("hello"))  
//    // HELLO  
//}  
  
//함수의 반환 타입으로 람다를 설정할 수도 있음  
//fun toSeconds(time: String): (Int) -> Int = when (time) {  
//    "시간" -> { value -> value * 60 * 60 }  
//    "분" -> { value -> value * 60 }  
//    "초" -> { value -> value }  
//    else -> { value -> value }  
//}  
//fun main() {  
//    val timesInMinutes = listOf(2, 10, 15, 1)  
//    val min2sec = toSeconds("분")  
//    val totalTimeInSeconds = timesInMinutes.map(min2sec).sum()  
//    println("총 시간은 $totalTimeInSeconds 초입니다.")  
//    // Total time is 1680 secs  
//}  
  
//람다식을 쓰고 그 뒤에 괄호와 매개변수값을 적으면 람다식 하나로 실행 시킬 수 있음  
fun main() {  
    println({text: String -> text.uppercase() }("hello") );  
}

## 람다 표현식이란?

람다 표현식 (익명 함수)란 함수의 이름과 선언부를 없애고 값으로 다루는 방식임

말만 들으면 이해하기 어려우니 예시로 설명하면

fun uppercaseString(text: String): String {  
    return text.uppercase()  
}  

위 함수는 String을 매개변수로 받아서 대문자로 변환 해주는 함수임

하지만 아래처럼 변수에 담아서 사용할 수도 있음 이를 일급 객체라고 함

fun main() {  
    val upperCaseString = { text: String -> text.uppercase() }  
    println(upperCaseString("hello"))  
    // HELLO  
}  

이렇게 람다 표현식을 사용하면 코드를 간소화 할 수 있음


사용 규칙

 

=