ifEmpty

파이프라인이 비어 있는 것으로 판명되면 대체 소스로 전환합니다 — 반복 시점에, 지연 방식으로 결정됩니다.

Iterable<A> ifEmpty<A>(Iterable<A> Function() fallback, Iterable<A> iterable) Iterable<A> defaultIfEmpty<A>(A value, Iterable<A> iterable) FxAsyncIterable<A> ifEmptyAsync<A>(FxAsyncIterable<A> Function() fallback, FxAsyncIterable<A> iterable) FxAsyncIterable<A> defaultIfEmptyAsync<A>(FutureOr<A> value, FxAsyncIterable<A> iterable) Fx<T> Fx<T>.ifEmpty(Iterable<T> Function() fallback) / .defaultIfEmpty(T value) // chain (sync) FxAsync<T> FxAsync<T>.ifEmpty(FxAsyncIterable<T> Function() fallback) / .defaultIfEmpty(FutureOr<T> value) // chain (async)

강의

아무것도 만들지 않을 수도 있는 파이프라인은 보통 우회를 강요합니다. 구체화하고, isEmpty를 검사하고, 분기하는 식입니다. 그러면 체인이 끊기고 — 더 나쁘게는 — 의도한 시점보다 먼저 파이프라인이 실행됩니다. ifEmpty(fallback)은 그 분기를 파이프라인 자체에 접어 넣습니다. 값은 손대지 않고 그대로 통과하며, 소스가 아무것도 내놓지 않은 채 끝났을 때만 대체 이터러블이 이어받습니다. 그 외의 경우에는 대체 함수가 호출조차 되지 않습니다 — 양방향으로 지연 평가됩니다.

defaultIfEmpty(value)는 값 하나짜리 축약형입니다. 자리 표시용 행, 빈 보고서의 0, "결과 없음" 표시 같은 것들입니다. 둘 다 체인의 어느 위치에서든 조합할 수 있는데, 이는 공격적인 필터링 뒤에서 중요해집니다 — 비어 있는지 여부는 원래 소스가 아니라 이 지점에 도달한 것들로 결정되기 때문입니다.

Dart 고유의 추가 기능입니다(FxTS에는 대응물이 없습니다). Rx의 switchIfEmpty / defaultIfEmpty를 따랐습니다. 비동기 형태는 비동기 대체 체인과 Future 기본값을 받으며, concurrent와 조합됩니다.

데모 1 · 빈 보고서를 위한 기본값

데모 2 · 대체 소스, 그 외에는 손대지 않음

직접 해 보기

연습: 대체 검색어를 갖춘 검색을 만들어 보세요.

관련 항목: filter — 체인이 비게 되는 가장 흔한 이유 · concat — 조건 없이 덧붙이기 · head — 값 하나에 대해서는 대체 값 대신 null