val filteredList = mutableListOf<String>()
for (upperCase in upperList) {
if (upperCase == "A" || upperCase == "C") {
filteredList.add(upperCase)
}
}
println(filteredList)
// [A, C]
for loop를 filter로 변환 후
val filteredList = upperList.filter { it == "A" || it == "C" }
println(filteredList)
// [A, C]
자바8의 스트림과 비교
자바8 스트림은 중간 연산자(map, filter, flatMap 등)만 사용했을 때는 아무런 동작도 하지 않는다.
값을 얻고 싶으면 최종 연산자(Terminal operator)를 사용해야한다.
val filteredList = upperList.stream().filter { it == "A" || it == "C" }
println(filteredList)
// java.util.stream.ReferencePipeline$2@77b52d12
val filteredList = upperList.stream()
.filter { it == "A" || it == "C" }
.collect(Collectors.toList())
println(filteredList)
// [A, C]
코틀린에서는 sequence를 사용해 자바8 스트림과 같이 Lazy하게 동작시킬 수 있다.
val filteredList = upperList
.asSequence()
.filter { it == "A" || it == "C" }
println(filteredList)
// kotlin.sequences.FilteringSequence@7f560810
Sequence API도 최종 연산자를 사용해야 중간 연산자가 동작한다.
val filteredList = upperList
.asSequence()
.filter { it == "A" || it == "C" }
.toList()
println(filteredList)
// [A, C]
추가
일반적으로 인라인 함수는 각각 함수가 동작할 때마다 조건에 맞는 컬렉션을 생성한다.
Sequence API는 각각의 함수가 동작할 때 sequence를 생성하고 최종 연산자를 호출할 때 1개의 컬렉션을 생성한다.
벤치마크 상으로 일반적으로는 인라인 함수가 빠르기 때문에 인라인 함수를 쓰고 대량의 데이터를 다룰 때는 sequence API 사용을 추천한다.
01. Kotlin 컬렉션
컬렉션 타입
컬렉션에 대해
List
,Set
,Map
을 제공한다.컬렉션 생성 방법
apply
함수를 사용하면 가독성이 좋아진다.to
라는 중위 함수로Key-Value
구조를 전달한다.컬렉션 빌더
를 사용해 컬렉션을 생성할 수 있다.buildList
,buildSet
,buildMap
3종류 제공컬렉션 반복하기
Iterable
의 구현체이므로 순차적 반복이 가능하다.forEach
를 사용해 Iterable을 구현한 컬렉션을 반복할 수 있다.for loop
를 사용하면 암시적으로 Iterator를 사용하기 때문에 조금 더 쉽게 반복할 수 있다.forEach
,map
,filter
와 같은 유용한인라인 함수
를 제공한다.sequence
를 사용해 자바8 스트림과 같이Lazy
하게 동작시킬 수 있다.Sequence API
도 최종 연산자를 사용해야 중간 연산자가 동작한다.추가