Kotlin의 Iterable과 Sequence는 정확히 동일하게 보입니다. 두 가지 유형이 필요한 이유는 무엇입니까?
이 두 인터페이스 모두 하나의 메서드 만 정의합니다.
public operator fun iterator(): Iterator<T>
문서에 따르면 Sequence
게으르다는 의미입니다. 그러나 Iterable
게으르지도 Collection
않습니까 ( a가 뒷받침하지 않는 한 )?
의미의 차이점 거짓말하고 대한 다음 stdlib 확장 기능의 구현 Iterable<T>
과 Sequence<T>
.
의 경우
Sequence<T>
확장 기능은 Java Streams 중간 작업 과 유사하게 가능한 경우 느리게 수행 됩니다. 예를 들어,Sequence<T>.map { ... }
다른Sequence<R>
항목을 반환 하고 또는 같은 터미널 작업 이 호출 될 때까지 항목을 실제로 처리하지 않습니다 .toList
fold
이 코드를 고려하십시오.
val seq = sequenceOf(1, 2) val seqMapped: Sequence<Int> = seq.map { print("$it "); it * it } // intermediate print("before sum ") val sum = seqMapped.sum() // terminal
다음을 인쇄합니다.
before sum 1 2
Sequence<T>
Java Streams와 마찬가지로 터미널 작업 에서 수행되는 작업을 최대한 줄이고 자 할 때 지연 사용 및 효율적인 파이프 라이닝을위한 것입니다 . 그러나 게으름으로 인해 약간의 오버 헤드가 발생하여 작은 컬렉션의 일반적인 단순 변환에는 바람직하지 않으며 성능이 떨어집니다.일반적으로 필요한시기를 결정하는 좋은 방법이 없으므로 Kotlin에서는 stdlib 게으름이 명시 적으로 만들어 지고 기본적
Sequence<T>
으로 모든에서 사용하지 않도록 인터페이스로 추출됩니다Iterable
.들어
Iterable<T>
반대와 확장 기능, 중간 동작의 의미가 열심히 일을, 바로 항목을 처리하고 다른 반환Iterable
. 예를 들어, 매핑 결과와 함께Iterable<T>.map { ... }
aList<R>
를 반환 합니다.Iterable에 해당하는 코드 :
val lst = listOf(1, 2) val lstMapped: List<Int> = lst.map { print("$it "); it * it } print("before sum ") val sum = lstMapped.sum()
다음과 같이 출력됩니다.
1 2 before sum
위에서 언급했듯이
Iterable<T>
기본적으로 지연되지 않으며이 솔루션은 잘 보여줍니다. 대부분의 경우 참조 위치 가 좋으 므로 CPU 캐시, 예측, 프리 페치 등을 활용하여 컬렉션을 여러 번 복사해도 여전히 잘 작동합니다. 작은 컬렉션이있는 간단한 경우에 더 잘 수행됩니다.평가 파이프 라인에 대한 더 많은 제어가 필요한 경우
Iterable<T>.asSequence()
기능이 있는 지연 시퀀스로의 명시 적 변환이 있습니다.
핫키의 답변 완료 :
Sequence 및 Iterable이 요소 전체에서 어떻게 반복되는지 확인하는 것이 중요합니다.
시퀀스 예 :
list.asSequence()
.filter { field ->
Log.d("Filter", "filter")
field.value > 0
}.map {
Log.d("Map", "Map")
}.forEach {
Log.d("Each", "Each")
}
로그 결과 :
필터-지도-각각; 필터-지도-각각
반복 가능한 예 :
list.filter { field ->
Log.d("Filter", "filter")
field.value > 0
}.map {
Log.d("Map", "Map")
}.forEach {
Log.d("Each", "Each")
}
필터-필터-지도-지도-각각-각각
'Programing' 카테고리의 다른 글
Xcode6 : Objective-C로 IBDesignable 및 IBInspectable (0) | 2020.11.01 |
---|---|
Django를 1.9 오류로 업그레이드하는 중 "AppRegistryNotReady : 앱이 아직로드되지 않았습니다." (0) | 2020.11.01 |
Java에서 파일 이동 / 복사 작업 (0) | 2020.11.01 |
원래 생성 / 수정 된 타임 스탬프가있는 오래된 파일 체크 아웃 (0) | 2020.11.01 |
임베디드 C ++ : STL 사용 여부? (0) | 2020.11.01 |