Dart リスト(配列)の各値の演算結果を蓄積する

Dart リスト(配列)の各値の演算結果を蓄積する

Dartで、リスト(配列)の各値の演算結果を蓄積するコードを記述してます。「reduce」を使用します。値が1つしかないリストに使用すると、そのまま値が返ります。また空のリストに使用するとエラーとなります。

環境

  • OS windows11 home
  • Dart 2.18.4

各値の演算結果を蓄積

各値の演算結果を蓄積するには「 reduce 」を使用します。

リスト.reduce((accumulator,currentValue))

accumulator : コールバック関数の結果を累積する
currentValue : 処理されている配列の値

実際に、使用してリストの合計を取得してみます。

void main() {
  var list = [1, 2, 3, 4, 5];

  print(list.reduce((acc, curr) => acc + curr)); // 15
}

実行結果を見ると、合計が計算されていることが確認できます。

文字列のリストに使用して、全ての値を結合することもできます。

void main() {
  var list = ['a', 'b', 'c'];

  print(list.reduce((acc, curr) => acc + curr)); // abc
}

値が1つしかない場合

値が1つしかないものは、値がそのまま返ります。

void main() {
  var list = ['a'];

  print(list.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 list = [5];

  print(list.fold<int>(5,(acc, currentValue) => 
    (2 < currentValue) ? acc * 10 : acc + currentValue
  )); //50
}

「fold」は以下のように、初期値が設定されます。

void main() {
  var list = [1, 2, 3, 4, 5];

  print(list.fold<int>(10,(acc, currentValue) => 
    acc + currentValue
  )); //25
}

空のリスト(配列)

空のリスト(配列)に使用すると、エラーとなります。

void main() {
  var list = [];

  print(list.reduce((acc, curr) => acc + curr));
}

Unhandled exception:
Bad state: No element
#0      ListMixin.reduce (dart:collection/list.dart:222:22)
#1      main (file:///c:/sample/main.dart:4:14)
#2      _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
#3      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12)