プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

DartのHashSetの要素をまとめて処理する

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

目次

  1. はじめに
  2. DartのHashSetの要素をまとめて処理する
  3. reduceメソッドの基本的な使い方
  4. 数値のHashSetを合計する
  5. 文字列のHashSetを連結する
  6. reduceメソッドを使用する場合の注意点
  7. おわりに

1. はじめに

こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。
2018年5月から毎日技術ブログを更新しています。

今回はDartHashSetで利用できるreduceメソッドについてです。

reduceメソッドを使用すると、HashSetの要素を順番に組み合わせて、1つの値にまとめられます。

目次へ

2. DartのHashSetの要素をまとめて処理する

DartHashSetSetを実装しているため、reduceメソッドを利用できます。

reduceメソッドは、最初の要素を結果の初期値として使用し、残りの要素をコールバックで順番に処理します。

形式は以下になります。

E reduce(E combine(E value, E element))

combineには、これまでの計算結果と次に処理する要素が渡されます。
処理を繰り返した結果として、HashSet全体から1つの値が返されます。

import 'dart:collection';

void main() {
  final numbers = HashSet<int>.from([1, 2, 3, 4]);

  final result = numbers.reduce((value, element) => value + element);

  print(result); // 10
}

目次へ

3. reduceメソッドの基本的な使い方

reduceメソッドのコールバックは、要素を2つ受け取ります。
第1引数のvalueは、それまでにまとめた結果です。
第2引数のelementは、次に処理するHashSetの要素です。

import 'dart:collection';

void main() {
  final numbers = HashSet<int>.from([2, 3, 4]);

  final result = numbers.reduce((value, element) {
    print('$value + $element');
    return value + element;
  });

  print(result); // 9
}

実行時には、最初の要素を起点にしてコールバックが呼び出されます。
ただし、HashSetは要素の順序を保証しないため、表示される処理順序は実行環境や要素の内容によって異なる場合があります。

目次へ

4. 数値のHashSetを合計する

数値を格納したHashSetでは、reduceメソッドを使って要素の合計値を求められます。

import 'dart:collection';

void main() {
  final prices = HashSet<int>.from([120, 250, 300]);

  final total = prices.reduce((value, price) => value + price);

  print(total); // 670
}

乗算など、コールバック内の処理を変更すれば、要素の積を求めることもできます。

final numbers = HashSet<int>.from([2, 3, 4]);
final product = numbers.reduce((value, element) => value * element);

print(product); // 24

目次へ

5. 文字列のHashSetを連結する

文字列のHashSetでは、reduceメソッドで要素を連結できます。

import 'dart:collection';

void main() {
  final words = HashSet<String>.from(['Dart', 'HashSet', 'reduce']);

  final result = words.reduce((value, element) => '$value, $element');

  print(result);
}

HashSetは順序を保証しないため、文字列を決まった順序で連結したい場合は、Listなどに変換して並べ替えてから処理する方法が適しています。

目次へ

6. reduceメソッドを使用する場合の注意点

空のHashSetでは使用できない

reduceメソッドは最初の要素を初期値として使用するため、空のHashSetに対して呼び出すとStateErrorが発生します。

final values = HashSet<int>();

// StateError: No element
final result = values.reduce((value, element) => value + element);

空の場合の初期値を指定したいときは、foldメソッドを使用します。

final values = HashSet<int>();
final result = values.fold(0, (value, element) => value + element);

print(result); // 0

HashSetの要素の順序に依存しない

HashSetは重複しない要素を管理するコレクションですが、要素の反復順序は保証されません。
減算や文字列連結など、処理順序によって結果が変わる処理では注意が必要です。

戻り値の型を意識する

reduceメソッドはHashSetの要素と同じ型の値を返します。
異なる型の初期値を指定して集計したい場合は、foldメソッドを使用してください。

要素を変更する処理には使用しない

reduceは要素を追加・削除するメソッドではありません。
HashSet自体を変更する場合は、addaddAllremoveなどのメソッドを使用します。

リファレンス

Dart

DartPad

HashSet

Set.reduce

Set.fold

目次へ

7. おわりに

DartHashSetreduceメソッドを使用すると、要素を順番に組み合わせて1つの値にまとめられます。

final numbers = HashSet<int>.from([1, 2, 3]);
final result = numbers.reduce((value, element) => value + element);

print(result); // 6

ただし、reduceメソッドは空のHashSetでは使用できず、要素の順序も保証されません。
空の場合の初期値が必要な場合や、異なる型へ集計したい場合はfoldメソッドを利用してください。

目次へ


私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。

組み込み分野では、リアルタイム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

目次へ