{ x: Int, y: Int -> x + y }
{, }
로 둘러싸여 있다.(, )
가 없다.val sum = { x: Int, y: Int -> x + y }
println(sum(1, 2)) // 3
{ println(42) }() // 42
run { println(42) } // 42
data class Person(val name: String, val age: Int)
val people = listOf(Person("Alice", 29), Person("Bob", 31))
people.maxBy({ p: Person -> p.age })
people.maxBy() { p: Person -> p.age }
poeple.maxBy { p: Person -> p.age }
people.maxBy { p -> p.age }
people.maxBy { it.age }
it
디폴트 파라미터를 사용할 수 있다.NOTE
중첩된 람다에서는 가급적 타입을 명시해주는 것이 좋다.
it
를 중첩적으로 사용하는것이 좋지는 않다.
val sum = { x: Int, y: Int ->
println("Computing the sum of ${x} and ${y}...")
x + y
}
::
people.maxBy(People::age)
fun salute() = println("Salute!")
run(::salute)
data class Person(val name: String, val age: Int)
fun main(args: Array<String>) {
val createPerson = ::Person
val p = createPerson("Alice", 29)
println(p) // Person(name=Alice, age=29)
}
val ageFunction = Person::age // 수신 객체 파라미터를 받아서 age를 리턴하는 람다식
val printAgeFunction = { person: Person -> println("${person.name} is ${ageFunction(person)} years old") }
printAgeFunction(p) // Alice is 29 years old
val boundedMemberRef = p::age
println(boundedMemberRef()) // 29
val numbers = mapOf(0 to "zero", 1 to "one")
println(numbers.mapValues { it.value.toUpperCase() })
println(numbers.mapKeys { "${it.key}_${it.value}" })
println(numbers.filterKeys { it % 2 == 0 })
println(numbers.filterValues { it.startsWith("o") })
val people = listOf(Person("Alice", 27), Person("Bob", 31))
println(people.find(canBeInClub27))
println(people.firstOrNull(canBeInClub27))
find
== firstOrNull
val list = listOf("a", "ab", "b", "c", "abc", "bc", "bcd", "cd", "d")
println(list.groupBy(String::first))
// {a=[a, ab, abc], b=[b, bc, bcd], c=[c, cd], d=[d]}
flatMap
== map
with toList
and flatten
val books = listOf(Book("Thursday Next", listOf("Jasper Fforde")),
Book("Mort", listOf("Terry Pratchett")),
Book("Good Omens", listOf("Terry Pratchett",
"Neil Gaiman")))
println(books.flatMap { it.authors }.toSet())
// [Jasper Fforde, Terry Pratchett, Neil Gaiman]
val listOfLists = listOf(listOf(1,2,3), listOf(4,5,6), listOf(2,5,7))
println(listOfLists.flatten())
// [1, 2, 3, 4, 5, 6, 2, 5, 7]
asSequence()
)println(
listOf(1, 2, 3, 4).asSequence()
.filter { it * it < 5 }
.map { it * it }
.toList()
)
generateSequence
val naturalNumbers = generateSequence(0) { it + 1 }
val numbersTo100 = naturalNumbers.takeWhile { it <= 100 }
println(numbersTo100.sum())
fun File.isInsideHiddenDirectory() =
generateSequence(this) { it.parentFile }.any { it.isHidden }
fun File.getInsideHiddenDirectory() =
generateSequence(this) { it.parentFile }.firstOrNull{ it.isHidden}
fun main(args: Array<String>) {
val file = File("/Users/svtk/.HiddenDir/a.txt")
println(file.isInsideHiddenDirectory()) // true
println(file.getInsideHiddenDirectory()) // /Users/svtk/.HiddenDir
val file2 = File("/Users/svtk/Documents/a.txt")
println(file2.isInsideHiddenDirectory()) // false
println(file2.getInsideHiddenDirectory()) // null
}
SAM
Single Abstract Method (= Funtional Interface)
fun createAllDoneRunnable(): Runnable {
return Runnable { println("All done!") }
}
fun main(args: Array<String>) {
createAllDoneRunnable().run() // All done!
// { println("All done?!")}.run() // Compile Error
}
with
, apply
with
fun alphabet(): String {
val result = StringBuilder()
for (letter in 'A'..'Z') {
result.append(letter)
}
result.append("\nNow I know the alphabet!")
return result.toString()
}
fun alphabet() = with(StringBuilder()) {
for (letter in 'A'..'Z') {
this.append(letter) // this 생략 가능
}
append("\nNow I know the alphabet!")
toString()
}
apply
fun alphabet() = StringBuilder().apply {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know the alphabet!")
}.toString()
fun alphabet() = buildString {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know the alphabet!")
}