takeWhileRight

소스 에서 술어가 참인 가장 긴 구간을, 원본 순서 그대로 남깁니다.

Iterable<A> takeWhileRight<A>(bool Function(A a) f, Iterable<A> iterable) FxAsyncIterable<A> takeWhileRightAsync<A>(bool Function(A a) f, FxAsyncIterable<A> iterable) Fx<T> Fx.takeWhileRight(bool Function(T a) f) // chain FxAsync<T> FxAsync.takeWhileRight(bool Function(T a) f)

강의

takeRight가 마지막 n개를 가져온다면, takeWhileRight조건에 맞는 마지막 원소들을 가져옵니다 — 몇 개가 될지는 결과가 알려줍니다. takeRight에 대한 이 연산자의 관계는, takeWhiletake에 대해 갖는 관계와 같습니다 — 개수를 받던 자리에 술어가 들어섭니다.

맨 끝까지 이어지는 구간만 인정됩니다. 마지막 원소가 이미 조건에서 떨어지면, 그 바로 앞에 아무리 긴 구간이 있었더라도 결과는 빕니다. "어디서든 가장 긴 구간"을 찾는 것이 아니라 접미사(suffix) 연산자인 이유가 여기에 있습니다.

결과는 뒤집히지 않고 원본 순서로 돌아옵니다. 그래서 라이브러리의 다른 연산자와 그대로 이어지고, dropWhileRight와도 아귀가 맞습니다 — 둘을 합치면 소스가 빠짐없이, 겹침도 없이 둘로 나뉩니다.

소스가 끝나기 전에는 아무것도 내보낼 수 없습니다. 마지막 원소가 도착하기 전까지는 어떤 원소가 접미사에 속하는지 알 수 없기 때문입니다. List라면 끝에서부터 거꾸로 훑어 그 구간을 찾으므로 술어는 해당 구간만 보게 되고, 그 밖의 소스라면 모든 원소를 순서대로 검사하며 현재 구간을 버퍼에 담습니다. 술어를 순수하게 유지하면 이 차이는 드러나지 않습니다.

데모 1 · 기본

데모 2 · 비동기, 그리고 분할

직접 해 보기

연습: 30 이상인 뒤쪽 구간만 남겨 보세요.

관련 항목: dropWhileRight — 같은 구간을 버리는 반대편 · takeRight — 개수로 자르는 뒤쪽 구간 · takeWhile — 같은 발상을 앞에서 · filter — 끝이 아니라 어디서든 맞는 값을 남깁니다