この記事は 2026 年 8 月 25 日に投稿しました。

目次
- はじめに
- DartのHashSetに別のIterableを続けて処理する
- followedByメソッドの基本的な使い方
- HashSetと別のHashSetを連結する
- 重複要素の扱い
- followedByメソッドを使用する場合の注意点
- おわりに
1. はじめに
こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。
2018年5月から毎日技術ブログを更新しています。
今回はDartのHashSetに格納された要素の後ろへ、別のIterableの要素を続けて処理できるfollowedByメソッドについてです。
2. DartのHashSetに別のIterableを続けて処理する
DartのHashSetでは、followedByメソッドを使用すると、HashSetの要素に別のIterableの要素を続けて扱うことができます。
followedByメソッドの形式は以下になります。
Iterable<E> followedBy(Iterable<E> other)
引数には、HashSetの要素の後ろに続けたいIterableを指定します。
戻り値は、元のHashSetの要素と引数に指定したIterableの要素を順番に返すIterableです。
import 'dart:collection'; void main() { final first = HashSet<int>(); first.addAll([10, 20, 30]); final second = [40, 50]; final result = first.followedBy(second); print(result.toList()); }
実行結果は以下になります。
[10, 20, 30, 40, 50]
ただし、HashSetは要素の順序を保証しないため、HashSet側の要素の順序は実行環境などによって異なる場合があります。
3. followedByメソッドの基本的な使い方
followedByメソッドは、元のIterableを変更せずに、複数のIterableを連続して扱うために使用します。
import 'dart:collection'; void main() { final languages = HashSet<String>(); languages.addAll(['Dart', 'Flutter']); final result = languages.followedBy(['Swift', 'C#']); for (final language in result) { print(language); } }
この例では、HashSetの要素をすべて処理した後に、Swift、C#が処理されます。
followedByメソッドの戻り値はIterableなので、toListやtoSetを使用して、必要なコレクションへ変換できます。
final resultList = languages.followedBy(['Swift', 'C#']).toList(); final resultSet = languages.followedBy(['Swift', 'C#']).toSet();
なお、followedByメソッドを呼び出しただけでは、元のHashSetに要素が追加されることはありません。
4. HashSetと別のHashSetを連結する
引数には、別のHashSetを指定することもできます。
import 'dart:collection'; void main() { final first = HashSet<int>(); first.addAll([1, 2, 3]); final second = HashSet<int>(); second.addAll([4, 5, 6]); final result = first.followedBy(second).toList(); print(result); }
この場合、firstの要素に続けてsecondの要素を処理できます。
複数のIterableを連結する場合は、followedByメソッドを続けて呼び出すこともできます。
final result = first
.followedBy(second)
.followedBy([7, 8])
.toList();
5. 重複要素の扱い
followedByメソッドは、要素を連結するだけであり、重複要素を自動的に削除するわけではありません。
import 'dart:collection'; void main() { final numbers = HashSet<int>(); numbers.addAll([1, 2, 3]); final result = numbers.followedBy([3, 4, 5]).toList(); print(result); }
実行結果は次のようになります。
[1, 2, 3, 3, 4, 5]
重複を削除したい場合は、戻り値に対してtoSetメソッドを使用します。
final result = numbers.followedBy([3, 4, 5]).toSet();
print(result);
ただし、toSetで作成されるSetの種類や反復順序に依存した処理は避けてください。
6. followedByメソッドを使用する場合の注意点
followedByメソッドの戻り値は、元のIterableと追加したIterableを連結して扱う遅延評価のIterableです。
そのため、followedByを呼び出した時点で、すべての要素がListへコピーされるわけではありません。
final result = numbers.followedBy([4, 5]); // 必要になった時点で要素が列挙されます。 for (final number in result) { print(number); }
また、元のHashSetや後続のIterableを変更した後に列挙すると、変更内容が結果へ反映される場合があります。処理中にコレクションを変更すると、Concurrent modificationの例外が発生する可能性もあるため注意が必要です。
要素の順序を保証したい場合は、HashSetではなくListやLinkedHashSetなど、順序を管理できるコレクションを使用します。
followedByとaddAllの違い
| 方法 | 元のコレクション | 戻り値 | 重複の扱い |
|---|---|---|---|
| followedBy | 変更しない | 連結したIterable | 重複を保持する |
| addAll | 要素を追加する | void | Setでは重複を追加しない |
例えば、元のHashSetへ要素を追加したい場合は、addAllメソッドを使用します。
numbers.addAll([4, 5]);
一時的に複数のIterableを連結して処理したい場合は、followedByメソッドが適しています。
なお、followedByメソッドはHashSet固有のメソッドではありません。
HashSetはIterableとして扱えるため、Iterableで定義されているfollowedByメソッドを利用できます。
リファレンス
6. おわりに
DartのHashSetの要素に、別のIterableの要素を続けて処理するには、followedByメソッドを使用します。
final result = first.followedBy(second).toList();
followedByメソッドは元のHashSetを変更せず、HashSetの要素と引数に指定したIterableの要素を連結したIterableを返します。
ただし、重複要素は削除されないため、重複を取り除きたい場合はtoSetメソッドなどを使用します。
また、HashSetは要素の順序を保証しないため、順序が重要な処理ではListやLinkedHashSetなどの利用を検討します。
複数のコレクションを一時的に連結して処理したい場合に、followedByメソッドを利用できます。
私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。
組み込み分野では、リアルタイムOSを利用したシステム開発をはじめ、弊社製品のハイブリッドOS Bi-OS など、長年培ってきた組み込み・制御系の技術を活かした開発に取り組んでいます。
また、iOS(Swift/SwiftUI)やWindows(C#)をはじめとしたアプリケーション開発、Webシステムの開発などにも対応しています。
組み込みソフトウェア、モバイルアプリ、Windowsアプリ、Webシステムなど、ソフトウェア開発に関するご相談がございましたら、お気軽にお問い合わせください。
また、ニューラルでは一緒にソフトウェア開発に取り組んでいただける技術者の方も募集しています。
ご興味がございましたら、お気軽にお問い合わせください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688