컬렉션을 이터레이션하면서 주어진 람다에 각 원소를 넘겨서 람다가 true를 반환하는 원소만 모은다. Filter의 결과는 입력 컬렉션의 원소 중에서 주어진 조건문에 만족하는 원소만으로 이루어진 새로운 컬렉션이다.
나이가 20살 이상인 사람만 뽑아내는 Person 리스트
val people = listOf(Person(“Jenny”, 27), Person(“Joy”, 15), Person(“Tom”, 19))
println(people.filter { it.age >= 20 })
>> Jenny, 27
하지만, filter는 원소를 변환할 수 없다. 원소를 변환하기 위해서는 map 함수를 사용해야 한다.
각 원소를 원하는 형태로 변환할 수 있고, 변환한 결과를 모아 새 컬렉션을 만든다. 결과는 원본 리스트와 원소 개수는 같지만, 각 원소는 주어진 함수(람다)에 따라 변환된 새로운 컬렉션이다.
Person 리스트가 아닌 name 리스트 출력하고 싶을 때
val people = listOf(Person(“Jenny”, 27), Person(“Joy”, 15), Person(“Tom”, 19))
println(people.map { it.name })
>> Jenny, Joym, Tom
map 함수에 멤버 참조 적용
people.map(Person::name)
컬렉션의 모든 원소가 조건을 만족하는지 판단
20살 미만인지 아닌지 판단
val under30 = {p:Person -> p.age < 20 }
Val people = listOf(Person(“Jenny”, 27), Person(“Joy”, 15), Person(“Tom”, 19))
println(people.all(under20))
>> [false]
컬렉션의 원소 중 조건을 만족하는 원소가 하나라도 있는지 판단
20살 미만인지 아닌지 판단
val under30 = {p:Person -> p.age < 20 }
val people = listOf(Person(“Jenny”, 27), Person(“Joy”, 15), Person(“Tom”, 19))
println(people.any(under20))
>> [true]
조건을 만족하는 원소의 개수를 반환
val under30 = {p:Person -> p.age < 20 }
Val people = listOf(Person(“Jenny”, 27), Person(“Joy”, 15), Person(“Tom”, 19))
println(people.count(under20))
>> [2]
컬렉션을 이터레이터하면서 주어진 코드를 수행시킨다.
val people = listOf(Person(“Jenny”, 27), Person(“Joy”, 15), Person(“Tom”, 19))
people.forEach {
println(it.name)
}
forEach와 비슷하지만 onEach는 컬렉션이나 시퀀스를 다시 반환하기 때문에 메소드 연쇄 호출이 가능하다. forEach는 반환값이 Unit이므로 메소드 연쇄 호출이 불가능하다.
listOf(1,2,3,4,5).onEach { println(it) }.map( it * it }.joinToString(“,”)
>> [1,4,9,16,25]