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

目次
- はじめに
- DartのHashSetから条件に一致する最後の要素を取得する
- lastWhereメソッドの基本的な使い方
- orElseで一致する要素がない場合に対応する
- lastWhereメソッドを使用する場合の注意点
- おわりに
1. はじめに
こんにちは、iOS のエディタアプリPWEditorとその後継PWEditorNextの開発者の二俣です。
2018年5月から毎日技術ブログを更新しています。
今回はDartのHashSetから、条件に一致する最後の要素を取得できるlastWhereメソッドについてです。
2. DartのHashSetから条件に一致する最後の要素を取得する
DartのHashSetはIterableを実装しているため、lastWhereメソッドを使用できます。
lastWhereメソッドの形式は以下になります。
E lastWhere(bool test(E element), {E orElse()?})
引数には、要素が条件に一致するかを判定する関数を指定します。
複数の要素が条件に一致した場合、反復処理上で最後に一致した要素が返されます。
例えば、次のようなHashSetから、5より大きい要素を取得します。
import 'dart:collection'; void main() { final numbers = HashSet<int>.from([1, 6, 3, 8, 4]); final result = numbers.lastWhere((number) => number > 5); print(result); }
実行すると、条件に一致した要素のうち、最後に処理された要素が取得されます。
8
ただし、HashSetは要素の順序を保証しません。
そのため、lastWhereで取得される要素は、挿入順や数値の大小における最後の要素とは限りません。
3. lastWhereメソッドの基本的な使い方
文字列を格納したHashSetから、特定の文字で終わる最後の要素を取得することもできます。
import 'dart:collection'; void main() { final words = HashSet<String>.from([ 'Dart', 'Swift', 'C#', 'JavaScript', ]); final result = words.lastWhere((word) => word.endsWith('t')); print(result); }
lastWhereの戻り値は、HashSetの要素型と同じです。
この例では、条件に一致した文字列が返されます。
条件には、複数の条件を組み合わせて指定できます。
final numbers = HashSet<int>.from([2, 5, 8, 11, 14]); final result = numbers.lastWhere( (number) => number.isEven && number > 5, ); print(result); // 14
4. orElseで一致する要素がない場合に対応する
条件に一致する要素が存在しない場合、orElseを指定しなければStateErrorが発生します。
final numbers = HashSet<int>.from([1, 3, 5]); final result = numbers.lastWhere((number) => number.isEven);
このような場合は、orElseを指定して、代わりに返す値を定義できます。
final numbers = HashSet<int>.from([1, 3, 5]); final result = numbers.lastWhere( (number) => number.isEven, orElse: () => -1, ); print(result); // -1
ただし、orElseで返す値はHashSetの要素型として扱える値である必要があります。
一致する要素がないことを明確に表したい場合は、firstWhereなどと同様に、orElseでnullを返すのではなく、whereやlastOrNullなどの利用を検討します。
5. lastWhereメソッドを使用する場合の注意点
HashSetの順序は保証されない
HashSetは要素の順序を保証しません。
したがって、lastWhereの「最後」は、挿入順や並び順ではなく、その時点の反復処理順における最後を意味します。
数値の最大値など、順序に基づく最後の要素を取得したい場合は、lastWhereではなくreduce、fold、またはListへ変換して並べ替える方法を使用してください。
final numbers = HashSet<int>.from([10, 30, 20]); final maximum = numbers.reduce((a, b) => a > b ? a : b); print(maximum); // 30
一致する要素がない場合は例外が発生する
orElseを指定しない場合、条件に一致する要素がなければStateErrorが発生します。
入力内容によって一致する要素がない可能性がある場合は、orElseを指定するなどして対応してください。
元のHashSetは変更されない
lastWhereメソッドは、HashSetの要素を検索して値を返すだけです。
呼び出しても、元のHashSetの要素が追加・削除されることはありません。
final numbers = HashSet<int>.from([1, 2, 3]); final result = numbers.lastWhere((number) => number > 1); print(numbers); // {1, 2, 3} print(result); // 条件に一致した最後の要素
検索中にHashSetを変更しない
lastWhereの判定処理中に、対象のHashSetへ要素を追加したり削除したりしないでください。
反復処理中のコレクションを変更すると、実行時エラーや予期しない結果の原因になります。
リファレンス
6. おわりに
DartのHashSetから条件に一致する最後の要素を取得するには、lastWhereメソッドを使用します。
final result = numbers.lastWhere((number) => number > 5);
複数の要素が条件に一致した場合、反復処理順で最後に一致した要素が返されます。
ただし、HashSetは要素の順序を保証しないため、挿入順や大小関係に基づく最後の要素を取得できるとは限りません。
条件に一致する要素がない場合はStateErrorが発生するため、必要に応じてorElseを指定してください。
順序に基づく最大値などを取得したい場合は、lastWhere以外の方法を使用する必要があります。
HashSetから条件に合う要素を後ろから探したい場合に、lastWhereメソッドを利用できます。
私が技術者として所属している ニューラル では、 組み込み・制御系ソフトウェアを中心に、モバイルアプリや業務アプリなど、さまざまなソフトウェアの開発を行っています。
組み込み分野では、リアルタイム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