🎯

Stream skip method

2025/01/08に公開

Skip Stream Example

https://api.dart.dev/dart-async/Stream/skip.html

概要

skip()メソッドは、Streamの最初のn個のイベントをスキップする機能を提供します。これは、初期値や不要なデータを除外したい場合に特に有用です。

example

import 'dart:async';

/// 指定秒数分の値をスキップするStream
Stream<int> skipSleepStream() async* {
  var count = 0;
  while (count < 10) {
    yield count;
    await Future<void>.delayed(Duration(seconds: 1));
    count++;
  }
}

void main() {
  final stream = skipSleepStream();
  
  print('スキップなしの場合:');
  stream.listen((value) => print('オリジナル: $value'));
  
  print('\nスキップ(3)を使用した場合:');
  // 最初の3つの値をスキップ
  skipSleepStream()
      .skip(3)
      .listen(
        (value) => print('Skip後: $value'),
        onDone: () => print('完了'),
      );
}

コードの説明

Stream生成部分

Stream<int> skipSleepStream() async* {
  var count = 0;
  while (count < 10) {
    yield count;
    await Future<void>.delayed(Duration(seconds: 1));
    count++;
  }
}
  • 0から9までの値を1秒間隔で生成
  • 合計10個の値を出力

skip()の使用方法

stream.skip(3).listen((value) => print('Skip後: $value'));

skip(3)は以下のように動作します:

  1. 最初の3つの値(0, 1, 2)をスキップ
  2. 残りの値(3, 4, 5, 6, 7, 8, 9)のみを出力

出力例

スキップ(3)を使用した場合:
オリジナル: 0
オリジナル: 1
オリジナル: 2
オリジナル: 3
Skip後: 3
オリジナル: 4
Skip後: 4
オリジナル: 5
Skip後: 5
オリジナル: 6
Skip後: 6
オリジナル: 7
Skip後: 7
オリジナル: 8
Skip後: 8
オリジナル: 9
Skip後: 9
完了

使用例

  1. センサーデータの初期ノイズの除去
  2. ストリーム開始時の不安定なデータのスキップ
  3. ページネーションでの特定ページまでのスキップ
  4. ウォームアップ期間後のデータ収集

重要なポイント

  • skip(n)のnは正の整数である必要がある
  • nがストリームの長さより大きい場合、出力は空になる
  • ブロードキャストストリームの場合、スキップはリスン開始時点からカウント
  • エラーイベントはスキップされない(そのまま通過する)

関連するStreamメソッド

  • skipWhile(): 条件が真である間スキップ
  • skipUntil(): 別のストリームがイベントを発行するまでスキップ
  • take(): 最初のn個のイベントのみを取得(skipの逆)

注意点

  • メモリ効率: スキップされた値はメモリに保持されない
  • 非同期処理: スキップ処理は非同期で行われる
  • ブロードキャストストリーム: 各リスナーに対して個別にスキップが適用される

Discussion