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
} 이렇게 람다 표현식을 사용하면 코드를 간소화 할 수 있음
사용 규칙
=