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

目次
- はじめに
- DartのHashSetのすべての要素が条件を満たしているか確認する
- 条件を満たさない要素がある場合
- 空のHashSetでeveryメソッドを使用した場合
- everyメソッドを使用する場合の注意点
- おわりに
1. はじめに
こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。
2018年5月から毎日技術ブログを更新しています。
今回はDartのHashSetのすべての要素が指定した条件を満たしているか確認できるeveryメソッドについてです。
2. DartのHashSetのすべての要素が条件を満たしているか確認する
DartのHashSetでは、everyメソッドを使用すると、格納されているすべての要素が指定した条件を満たしているか確認できます。
everyメソッドの形式は以下になります。
bool every(bool test(E element))
引数には、各要素が条件を満たしているかを判定する関数を指定します。
すべての要素について関数がtrueを返した場合、everyメソッドはtrueを返します。
例えば、次のHashSetがあるとします。
final numbers = HashSet<int>(); numbers.addAll([ 10, 20, 30, 40, ]);
すべての要素が0より大きいか確認する場合は、次のように記述できます。
final result = numbers.every((number) => number > 0);
print(result);
すべての要素が0より大きいため、
true
となります。
実装例
import 'dart:collection'; void main() { final numbers = HashSet<int>(); numbers.addAll([ 10, 20, 30, 40, ]); final result = numbers.every((number) => number > 0); print(result); }
この例では、
(number) => number > 0
が各要素に対する判定条件です。
それぞれの要素について、
10 > 0 20 > 0 30 > 0 40 > 0
がすべてtrueになるため、everyメソッドもtrueを返します。
条件は数値の比較だけではありません。
例えば、文字列を格納したHashSetで、すべての文字列が空ではないことを確認できます。
import 'dart:collection'; void main() { final languages = HashSet<String>(); languages.addAll([ 'Dart', 'Flutter', 'Swift', ]); final result = languages.every( (language) => language.isNotEmpty, ); print(result); }
すべての文字列が空ではないため、
true
となります。
文字列の長さを条件にすることもできます。
final result = languages.every(
(language) => language.length >= 4,
);
print(result);
このように、everyメソッドを使用すると、
すべての数値が指定値以上か すべての文字列が空ではないか すべてのオブジェクトが特定の状態になっているか
といった、コレクション全体に対する条件判定を簡潔に記述できます。
例えば、everyメソッドを使用せずに同様の処理を書く場合、
var result = true; for (final number in numbers) { if (number <= 0) { result = false; break; } }
のような処理が必要になります。
everyメソッドを利用すれば、
final result = numbers.every(
(number) => number > 0,
);
と簡潔に記述できます。
なお、everyメソッドはHashSet固有のメソッドではありません。
HashSetはIterableとして扱えるため、Iterableで定義されているeveryメソッドを利用できます。
そのため、Listなどでも同じように使用できます。
final numbers = [ 10, 20, 30, ]; final result = numbers.every( (number) => number > 0, ); print(result);
この場合も、
true
となります。
3. 条件を満たさない要素がある場合
everyメソッドでは、1つでも条件を満たさない要素が存在するとfalseが返されます。
例えば、
import 'dart:collection'; void main() { final numbers = HashSet<int>(); numbers.addAll([ 10, 20, -30, 40, ]); final result = numbers.every( (number) => number > 0, ); print(result); }
とします。
このHashSetには、
-30
が含まれています。
条件は、
number > 0
なので、-30は条件を満たしません。
そのため、結果は、
false
となります。
つまり、everyメソッドは、
すべての要素が条件を満たしているか
を判定するメソッドです。
1つでも条件を満たさない要素があればfalseになります。
また、everyメソッドは条件を満たさない要素を見つけた時点でfalseを返します。
例えば、
import 'dart:collection'; void main() { final numbers = HashSet<int>(); numbers.addAll([ 10, 20, -30, 40, ]); final result = numbers.every((number) { print('check: $number'); return number > 0; }); print('result: $result'); }
のようにすると、各要素を判定している様子を確認できます。
条件を満たさない要素が見つかると、その時点で判定は終了します。
これは、例えば多数の要素がある場合でも、
すべての要素を必ず最後まで調べてからfalseを返す
という動作ではないということです。
なお、HashSetでは要素の反復順序が保証されていません。
そのため、どの要素が最初に判定されるかを前提にした処理を書くべきではありません。
例えば、
numbers.every((number) {
print(number);
return number > 0;
});
のprintが、要素を追加した順番で実行されるとは限りません。
everyメソッドに渡す判定処理は、
どの順番で呼ばれても同じ判定結果になる
ようにしておくのが分かりやすいでしょう。
4. 空のHashSetでeveryメソッドを使用した場合
everyメソッドを使用する際に覚えておきたいのが、空のHashSetに対して実行するとtrueになる点です。
例えば、
import 'dart:collection'; void main() { final numbers = HashSet<int>(); final result = numbers.every( (number) => number > 0, ); print(result); }
とします。
numbersには要素が1つもありませんが、結果は、
true
となります。
最初は、
要素がないのだからfalseになるのでは
と思うかもしれません。
しかし、everyメソッドは、
条件を満たしていない要素が存在するか
という観点で考えると分かりやすくなります。
空のHashSetには、
条件を満たしていない要素
が存在しません。
そのため、すべての要素が条件を満たしていると判断され、trueが返されます。
例えば、
final numbers = HashSet<int>(); print(numbers.every((number) => number > 1000));
としても、
true
となります。
さらに、
print(numbers.every((number) => false));
としても、判定対象となる要素自体が存在しないため、
true
となります。
この動作は、空のコレクションを処理する可能性がある場合に注意が必要です。
例えば、
final allPositive = numbers.every(
(number) => number > 0,
);
だけでは、
要素が1つ以上存在し、すべて正の数である
ことを判定しているわけではありません。
空の場合でもtrueになるためです。
要素が1つ以上存在することも条件に含めたい場合は、
final result =
numbers.isNotEmpty &&
numbers.every((number) => number > 0);
のようにできます。
これなら、
要素が1つ以上存在する
かつ、
すべての要素が0より大きい
場合だけtrueになります。
例えば、
import 'dart:collection'; void main() { final numbers = HashSet<int>(); final result = numbers.isNotEmpty && numbers.every((number) => number > 0); print(result); }
空のHashSetなので、
false
となります。
このように、everyメソッドを利用するときは、空のコレクションをどのように扱いたいのかも考慮するとよいでしょう。
5. everyメソッドを使用する場合の注意点
HashSetでeveryメソッドを使用する場合、まず理解しておきたいのが、すべての要素を対象として条件を判定するメソッドであるという点です。
例えば、
final numbers = HashSet<int>(); numbers.addAll([ 10, 20, 30, ]); final result = numbers.every( (number) => number >= 10, );
では、すべての要素が10以上なので、
true
となります。
一方、
final result = numbers.every(
(number) => number >= 20,
);
では、10が条件を満たさないため、
false
となります。
一部の要素だけが条件を満たしているか確認したい場合は、everyメソッドではなくanyメソッドが適しています。
例えば、
final result = numbers.any(
(number) => number >= 20,
);
とすると、
20 30
が条件を満たすため、
true
となります。
つまり、
numbers.every((number) => number >= 20);
は、
すべての要素が20以上か
を確認し、
numbers.any((number) => number >= 20);
は、
20以上の要素が1つでもあるか
を確認します。
用途によって使い分ける必要があります。
また、条件を満たしている要素そのものを取得したい場合は、whereメソッドを使用できます。
例えば、
final result = numbers.where(
(number) => number >= 20,
);
print(result);
とすると、条件を満たした要素を持つIterableを取得できます。
このように、
すべてが条件を満たすか確認する
場合はevery、
1つでも条件を満たすか確認する
場合はany、
条件を満たす要素を取得する
場合はwhere
というように使い分けることができます。
HashSetの順序について
HashSetは要素の反復順序を保証しません。
例えば、
import 'dart:collection'; void main() { final languages = HashSet<String>(); languages.add('Dart'); languages.add('Flutter'); languages.add('Swift'); languages.every((language) { print(language); return language.isNotEmpty; }); }
とした場合、
Dart Flutter Swift
という追加順に判定されることは保証されていません。
ただし、通常のeveryメソッドの使い方では、
languages.every( (language) => language.isNotEmpty, );
のように各要素を独立して判定するため、順序を意識する必要はありません。
一方で、判定関数の中で、
var count = 0; languages.every((language) { count++; // countに依存した処理 return true; });
のように、実行順序に依存する処理を行う場合は注意が必要です。
HashSetでeveryメソッドを使用する場合は、判定関数を各要素だけで判定できる形にしておく方が分かりやすくなります。
nullを含むHashSetの場合
nullを格納できるHashSetの場合は、判定条件でnullを考慮する必要があります。
例えば、
final languages = HashSet<String?>(); languages.addAll([ 'Dart', 'Flutter', null, ]);
とします。
この場合、
final result = languages.every( (language) => language != null, );
とすると、nullが含まれているため、
false
となります。
すべての要素がnullではなく、さらに空文字列でもないことを確認したい場合は、
final result = languages.every( (language) => language != null && language.isNotEmpty, );
のように記述できます。
オブジェクトの状態を確認する場合
everyメソッドは、単純な数値や文字列だけでなく、オブジェクトの状態を確認する場合にも利用できます。
例えば、
class Task { Task(this.name, this.completed); final String name; final bool completed; }
というクラスがあるとします。
すべてのタスクが完了しているか確認する場合は、
import 'dart:collection'; void main() { final tasks = HashSet<Task>(); tasks.addAll([ Task('Task1', true), Task('Task2', true), Task('Task3', true), ]); final allCompleted = tasks.every( (task) => task.completed, ); print(allCompleted); } class Task { Task(this.name, this.completed); final String name; final bool completed; }
とできます。
すべてのタスクのcompletedがtrueなので、
true
となります。
例えば1つだけ、
Task('Task2', false),
とすると、
false
となります。
このようにeveryメソッドは、
すべてのデータが有効か すべての処理が完了しているか すべての値が許容範囲内か
といった、複数の要素の状態をまとめて確認したい場合にも便利です。
なお、everyメソッドはHashSet固有のメソッドではなく、Iterableで定義されています。
そのため、HashSet以外のさまざまな反復可能オブジェクトでも利用できます。
リファレンス
6. おわりに
DartのHashSetのすべての要素が指定した条件を満たしているか確認するには、everyメソッドを使用できます。
例えば、
final numbers = HashSet<int>(); numbers.addAll([ 10, 20, 30, ]); final result = numbers.every( (number) => number > 0, );
とすると、すべての要素が0より大きい場合に、
true
が返されます。
一方、条件を満たさない要素が1つでも存在すると、
false
が返されます。
例えば、
numbers.add(-10);
final result = numbers.every(
(number) => number > 0,
);
では、-10が条件を満たさないためfalseになります。
また、everyメソッドは条件を満たさない要素を見つけた時点でfalseを返します。
HashSetでは反復順序が保証されていないため、判定の実行順序には依存しない処理にしておくとよいでしょう。
さらに注意したいのが、空のHashSetでeveryメソッドを使用すると、
final numbers = HashSet<int>(); print( numbers.every((number) => number > 0), );
の結果が、
true
になることです。
要素が存在すること自体も条件にしたい場合は、
final result =
numbers.isNotEmpty &&
numbers.every((number) => number > 0);
のように、isNotEmptyと組み合わせることができます。
また、
すべての要素が条件を満たすか
を確認する場合はeveryメソッド、
1つでも条件を満たす要素があるか
を確認する場合はanyメソッド、
条件を満たす要素を取得する
場合はwhereメソッドを利用できます。
everyメソッドは、コレクションに含まれているすべての要素が一定の条件を満たしていることを簡潔に確認したい場合に便利なメソッドです。
私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。
組み込み分野では、リアルタイム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