プログラムを書こう!

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

DartのHashSetから条件に一致する要素を1つ取得する

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

目次

  1. はじめに
  2. DartのHashSetから条件に一致する要素を1つ取得する
  3. singleWhereメソッドの基本的な使い方
  4. 条件に一致する要素が1つだけの場合
  5. 条件に一致する要素がない場合
  6. singleWhereメソッドを使用する場合の注意点
  7. おわりに

1. はじめに

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

今回はDartのHashSetで利用できるsingleWhereメソッドについてです。

singleWhereメソッドを使用すると、指定した条件に一致する要素を1つ取得できます。
条件に一致する要素が複数ある場合は例外が発生するため、条件に一致する要素が必ず1つだけであることを確認したい場合に利用できます。

目次へ

2. DartのHashSetから条件に一致する要素を1つ取得する

DartのHashSetはSetを実装しているため、singleWhereメソッドを利用できます。

形式は以下になります。

E singleWhere(bool test(E element), {E orElse()?})

引数に指定した条件関数がtrueを返す要素が1つだけの場合、その要素が返されます。

import 'dart:collection';

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

  final result = numbers.singleWhere((number) => number == 3);

  print(result); // 3
}

singleWhereメソッドはHashSetから要素を削除せず、条件に一致した要素を戻り値として返します。

目次へ

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

singleWhereメソッドには、各要素を判定する条件関数を指定します。

import 'dart:collection';

void main() {
  final languages = HashSet<String>.from([
    'Dart',
    'Swift',
    'C#',
    'Kotlin',
  ]);

  final language = languages.singleWhere((language) => language == 'Swift');

  print(language); // Swift
}

この例では、Swiftに一致する要素が1つだけ存在するため、その要素が返されます。
singleWhereメソッドは、条件に一致する要素を検索し、その要素を取得するために使用できます。

目次へ

4. 条件に一致する要素が1つだけの場合

条件関数では、比較演算子やメソッドを使ってさまざまな条件を指定できます。

import 'dart:collection';

void main() {
  final numbers = HashSet<int>.from([10, 15, 20, 25, 30]);

  final result = numbers.singleWhere((number) => number == 20);

  print(result); // 20
}

この例では、20に一致する要素が1つだけ存在するため、20が返されます。
条件を変更すれば、特定のIDを持つデータや、特定の文字列に一致するデータなどを取得できます。

final numbers = HashSet<int>.from([1, 2, 3, 4, 5, 6]);

final result = numbers.singleWhere((number) => number > 5);

print(result); // 6

目次へ

5. 条件に一致する要素がない場合

条件に一致する要素がない場合、orElseを指定していなければStateErrorが発生します。

import 'dart:collection';

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

  final result = numbers.singleWhere((number) => number.isEven);

  print(result); // StateError
}

条件に一致する要素がない場合の値を指定したいときは、orElseを使用します。

import 'dart:collection';

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

  final result = numbers.singleWhere(
    (number) => number.isEven,
    orElse: () => -1,
  );

  print(result); // -1
}

orElseは、条件に一致する要素がない場合に呼び出されます。
ただし、条件に一致する要素が複数ある場合は、orElseを指定していても例外が発生します。

目次へ

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

条件に一致する要素が複数あると例外が発生する

singleWhereメソッドは、条件に一致する要素が1つだけ存在することを前提としています。
複数の要素が一致するとStateErrorが発生します。

import 'dart:collection';

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

  final result = numbers.singleWhere((number) => number.isEven);

  print(result); // StateError
}

複数の要素から条件に一致する要素を取得したい場合は、whereメソッドを使用してください。

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

final results = numbers.where((number) => number.isEven).toSet();

print(results); // {2, 4}

条件に一致する要素がないと例外が発生する

条件に一致する要素がない可能性がある場合は、orElseを指定するか、例外を捕捉してください。
orElseを指定すると、該当する要素がない場合の処理を簡潔に記述できます。

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

HashSetは要素の順序を保証しません。
singleWhereメソッドは最初の要素や最後の要素を取得するのではなく、条件に一致する要素が1つだけ存在するかどうかを確認します。

HashSet自体は変更されない

singleWhereメソッドは要素を削除したり追加したりせず、取得した要素を戻り値として返します。

リファレンス

Dart

DartPad

HashSet

Set.singleWhere

目次へ

7. おわりに

DartのHashSetでsingleWhereメソッドを使用すると、条件に一致する要素が1つだけ存在することを確認し、その要素を取得できます。

import 'dart:collection';

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

  final result = numbers.singleWhere((number) => number == 3);

  print(result); // 3
}

条件に一致する要素がない場合や複数ある場合はStateErrorが発生します。
条件に一致する要素が必ず1つだけであることを確認しながら取得したい場合は、singleWhereメソッドを利用すると簡潔に記述できます。

目次へ


私が技術者として所属している ニューラルでは、

組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。

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

目次へ