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

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)