Programing

Kotlin의 Iterable과 Sequence는 정확히 동일하게 보입니다.

lottogame 2020. 11. 1. 17:14
반응형

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>항목을 반환 하고 또는 같은 터미널 작업 이 호출 될 때까지 항목을 실제로 처리하지 않습니다 .toListfold

    이 코드를 고려하십시오.

    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 { ... }a List<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")
                }

필터-필터-지도-지도-각각-각각

참고URL : https://stackoverflow.com/questions/35629159/kotlins-iterable-and-sequence-look-exactly-same-why-are-two-types-required

반응형