Dart Setの各値を演算して結果を蓄積する

Dartで、Setの各値を演算して結果を蓄積するコードを記述してます。「reduce」を使用します。値が「1つ」しかないSetに使用すると、そのまま値が返ります。また、空のSetに使用するとエラーとなります。
環境
- OS windows11 home
- Dart 2.18.4
各値の演算結果を蓄積
各値の演算結果を蓄積するには「 reduce 」を使用します。
リスト.reduce((accumulator,currentValue))
accumulator : コールバック関数の結果を累積する
currentValue : 処理されている配列の値
実際に、使用してリストの合計を取得してみます。
void main() {
var s = {1, 2, 3, 4, 5};
print(s.reduce((acc, curr) => acc + curr)); // 15
}
実行結果を見ると、合計が計算されていることが確認できます。

文字列のリストに使用して、全ての値を結合したりすることもできます。
void main() {
var s = {'a', 'b', 'c'};
print(s.reduce((acc, curr) => acc + curr)); // abc
}
値が1つしかない場合
値が1つしかないものは、値がそのまま返ります。
void main() {
var s = {'a'};
print(s.reduce((acc, curr) => acc + curr)); // a
}
なので、仮に条件を指定した場合などは期待される結果が得られません。
void main() {
var list = [5];
print(list.reduce((acc, currentValue) =>
(2 < currentValue) ? acc * 10 : acc + currentValue
)); // 5
}
fold
foldを使用すると初期値が設定できるので、値が1つしかない場合は「fold」を使用すれば解決します。
void main() {
var s = {5};
print(s.fold<int>(
5,
(acc, currentValue) =>
(2 < currentValue) ? acc * 10 : acc + currentValue)); //50
}
「fold」は以下のように、初期値を設定することが可能です。
void main() {
var s = {1, 2, 3, 4, 5};
print(s.fold<int>(10, (acc, currentValue) => acc + currentValue)); //25
}
空のSet
空のSetに使用すると、エラーとなります。
void main() {
var s = {1, 2, 3, 4, 5};
s.clear();
print(s.reduce((acc, curr) => acc + curr));
}
Unhandled exception:
Bad state: No element
#0 SetMixin.reduce (dart:collection/set.dart:148:7)
#1 main (file:///c:/sample/main.dart:6:11)
#2 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)
-
前の記事
PostgreSQL ROW(タプル)をjson形式で返す 2024.06.20
-
次の記事
「Google Maps JavaScript API error: RefererNotAllowedMapError」が発生した場合の対処法 2024.06.20
コメントを書く