2016-10-20 9 views
12
내가 (seq1 seq2를) 내가 필요로하는 모든이 반복 가능 객체에서 요소를 사용하는 반복자 반면 나는, 실제로 요소를 복사 있다고 걱정하고 있습니다 시퀀스 연결을하고 있지만거야 방법
val seq1 = sequenceOf(1, 2, 3) 
val seq2 = sequenceOf(5, 6, 7) 
sequenceOf(seq1, seq2).flatten().forEach { ... } 

나는 그것을했다.코 틀린 시퀀스 연결은

이러한 기능이 있습니까?

답변

16
귀하의 코드 시퀀스의 요소를 복사하지 않습니다

sequenceOf(seq1, seq2).flatten()은 실제로 당신이 원하는 것을 : 처음 seq1에서 다음 항목을 소요 시퀀스를 생성 할 때 seq2에서 seq1 마감.

은 또한, 운영자 + 정확히 이런 방식으로 구현됩니다, 그래서 당신은 단지 그것을 사용할 수 있습니다

(seq1 + seq2).forEach { ... } 
운영자의 소스는 예상대로

:

public operator fun <T> Sequence<T>.plus(elements: Sequence<T>): Sequence<T> { 
    return sequenceOf(this, elements).flatten() 
} 

당신은 좀 걸릴 수 있습니다 실제로는 원래 시퀀스의 반복자를 전환하는 FlatteningSequence을 사용하는 implementation of .flatten() in stdlib에서 발생합니다. 구현은 시간이 지남에 따라 바뀔 수 있지만 Sequence은 가능한 한 게으 르기위한 것이므로 비슷한 방식으로 동작 할 것으로 기대할 수 있습니다.

예 :

여기
val a = generateSequence(0) { it + 1 } 
val b = sequenceOf(1, 2, 3) 

(a + b).take(3).forEach { println(it) } 

, 그것은 무한이기 때문에 성공할 수 없다 첫 번째 순서를 복사하고, (a + b) 반복 항목을 a에서 하나 하나 걸립니다.


단, .flatten()Iterable에 대해 다른 방식으로 구현되며,이 요소를 복사 does있다. IterableSequencehere의 차이점에 대해 자세히 알아보십시오.