pairwise

각 원소를 그다음 원소와 짝짓습니다. [a, b, c]((a, b), (b, c))가 됩니다.

Iterable<(A, A)> pairwise<A>(Iterable<A> iterable) FxAsyncIterable<(A, A)> pairwiseAsync<A>(FxAsyncIterable<A> iterable) Fx<(T, T)> Fx<T>.pairwise() // chain (sync) FxAsync<(T, T)> FxAsync<T>.pairwise() // chain (async) FxEvents<(T, T)> FxEvents<T>.pairwise() // chain (events)

강의

"얼마나 변했는가?"라는 질문에는 한 번에 두 원소 — 이전 값과 현재 값 — 가 필요한데, 보통의 map은 언제나 하나만 봅니다. 흔한 우회로는 인덱스 루프(list[i - 1], off-by-one 위험 포함)이거나, 리스트를 한 칸 밀어 자기 자신과 zip하는 것입니다. pairwise()는 그 아이디어를 연산자로 만든 것입니다. (previous, current) 레코드를 지연 방식으로 내놓으며, 원소 n개에서 쌍 n − 1개가 나옵니다. 원소가 두 개 미만이면 아무것도 내놓지 않습니다 — 만들 쌍이 없기 때문입니다.

레코드 필드가 양쪽을 모두 손 닿는 곳에 둡니다. p.$2 - p.$1이 증감량이고, p.$2.compareTo(p.$1)이 방향입니다. 이는 정확히 2원소 리스트 대신 타입이 있는 레코드를 쓰는 windowed(2)입니다 — 이웃의 범위가 둘을 넘어서면 windowed를 쓰세요.

Dart 고유의 추가 기능입니다(FxTS에는 대응물이 없습니다). RxDart의 pairwise를 따랐습니다. 비동기 형태는 pull이 있기 전까지 아무것도 계산하지 않으며 concurrent와 조합됩니다.

데모 1 · 측정값 사이의 증감량

데모 2 · 변화의 방향

직접 해 보기

연습: 타임스탬프 시퀀스에서 빈 간격을 찾아 보세요.

관련 항목: windowed — 둘보다 큰 이웃 범위 · zip별개의 두 시퀀스 짝짓기 · scan — 한 칸 뒤를 돌아보는 대신 상태를 들고 가기