button.setOnclickListener { /*클릭시 수행 동작*/ }
println(people.maxBy { it.age }) //람다 사용
println(people.maxBy { p -> p.age })
println(people.maxBy(Person::age)) //멤버 참조 -> 이해하기 쉬움
::
를 사용하는 식을 멤버 참조라고 부른다.Person::age
클래스 멤버
fun salute() = println("Salute!") //최상위 함수
>> run(::salute) //>> Salute!
fun Person.isAdult() = age >= 21 //확장함수 isAdult()
val predicate = Person::isAdult
{ x : Int, y : Int -> x + y }
<--파라미터---><-본문->
val sum = { x: Int, y: Int -> x+y }
println(sum(1,2)) //변수에 저장된 람다를 함수처럼 호출
run { println(42) }
people.maxBy { p:Person -> p.age } //파라미터 타입 명시
people.maxBy { p -> p.age } //파라미터 타입 생략(컴파일러가 추론)
people.maxBy { it.age } //단일파라미터라면 타입생략&it사용
it
사용 가능val sum = { x:Int, y:Int ->
println("sum of $x and $y.....")
x+y //실제 람다 결과
}
fun printMessagesWithPrefix(messages: Collection<String>, prefix: String) {
var cnt = 0;
messages.forEach { //각 원소에 대해 수행할 작업을 람다로 받는다.
cnt++ //람다 밖에서 선언된 변수까지 변경 가능 -> 람다가 포획한 변수
println("$prefix $it") //람다 안에서 함수의 "prefix" 파라미터 사용 가능!!
}
}
여러가지 유용한 함수를 소개합니다!
val people = listOf(Person("Alice", 29), Person("Bob", 31))
println(people.filter{it.age>30})
//[Person(name=Bob, age=31)]
val list = listOf(1, 2, 3, 4)
println(list.map { it * it }) //제곱구하기
//[1, 4, 9, 16]
println(people.map{it.name})
//[Alice, Bob] //사람의 리스트 -> 이름의 리스트로
//people.map(Person::name) 도 가능
people.filter { it.age > 30 }.map(Person::name)
//30살 이상인 사람의 이름 출력
val list = listOf("a", "ab", "b")
println(list.groupBy(String::first) //확장함수 first 참조
//{a=[a, ab], b=[b]} //문자의 첫 문자열을 기준으로 그룹
/**
* class Book
* 책 이름
* 책을 쓴 저자는 1명 이상
*/
class Book(val title: String, val authors: List<String>)
fun main(args: Array<String>) {
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()) //books 컬렉션에 있는 책을 쓴 모든 저자의 집합
//toSet 은 중복 제거
}
val ary = arrayOf(
arrayOf(1),
arrayOf(2, 3),
arrayOf(4, 5, 6)
)
println(ary.flatten()) // [1, 2, 3, 4, 5, 6] 있는 내용 펼치기
listOf(1, 2, 3, 4).asSequence() //원본 컬렉션을 시퀀스로 변환
.map { print("map($it) "); it * it } //시퀀스도 컬렉션과 똑같은 API 제공
.filter { print("filter($it) "); it % 2 == 0 }
.toList() //결과 시퀀스를 다시 리스트로 변환
sequence.map{}.filter{}.toList()
중간연산-------------->최종연산
println(listOf(1,2,3,4).asSequence().map{it*it}.find{it>3})
//1*1 = 1
//2*2 = 4 > 3 --> 연산 종료(지연계산임)
fun alphabet() = with(StringBuilder()) {//메서드를 호출하려는 수신 객체를 지정
for (letter in 'A'..'Z') {
append(letter) //this.append(letter) 과 동일한 문장
}
append("\nNow I know the alphabet!") //여기도 this 생략
toString() //여기도 this 생략 //실제 리턴 값
}
fun alphabet() = buildString {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know the alphabet!")
}