val seq1 = sequenceOf(1, 2, 3)
val seq2 = sequenceOf(5, 6, 7)
sequenceOf(seq1, seq2).flatten().forEach { ... }
나는 그것을했다.코 틀린 시퀀스 연결은
이러한 기능이 있습니까?
val seq1 = sequenceOf(1, 2, 3)
val seq2 = sequenceOf(5, 6, 7)
sequenceOf(seq1, seq2).flatten().forEach { ... }
나는 그것을했다.코 틀린 시퀀스 연결은
이러한 기능이 있습니까?
및 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있다. Iterable
과 Sequence
here의 차이점에 대해 자세히 알아보십시오.