code: @Override
      public void updateState(MapState<KmeansDataSet> state, List<TridentTuple> tuples,
              TridentCollector collector)
      {
          // データが流れてきていない場合はupdateStateメソッドが呼ばれないため、本メソッド内ではデータが存在するとして扱う。
          List<KmeansDataSet> dataSets = state.multiGet(Arrays.asList(Arrays.asList((Object) this.stateName)));
          KmeansDataSet dataSet = null;
          if (dataSets != null && !dataSets.isEmpty())
          {
              dataSet = dataSets.get(0);
          }
  
          // TupleからKMeans用データを抽出する。
          List<KmeansPoint> receiveList = new ArrayList<>();
          for (TridentTuple targetTuple : tuples)
          {
              KmeansPoint recievedPoint = (KmeansPoint) targetTuple.get(0);
              receiveList.add(recievedPoint);
          }
  
          // 投入されたKMeans用点から学習モデルを生成する。
          KmeansDataSet generatedDataSet = KmeansCalculator.createDataModel(receiveList,
                  this.clusterNum, this.maxIteration, this.convergenceThreshold);
          if (generatedDataSet != null)
          {
              dataSet = generatedDataSet;
          }
  
          // 元々データモデルが存在せず、かつ投入された点が不足しており学習モデルが生成できなかった場合、以後の処理は行わない。
          if (dataSet == null)
          {
              return;
          }
  
          // データ通知拡張ポイントに値が設定されていた場合、クラスタリング結果を算出し、通知を行う。
          if (this.dataNotifier != null)
          {
              for (KmeansPoint targetPoint : receiveList)
              {
                  KmeansResult result = KmeansCalculator.classify(targetPoint, dataSet);
                  this.dataNotifier.notifyResult(result);
              }
          }
  
          // Save model
          state.multiPut(Arrays.asList(Arrays.asList((Object) this.stateName)),
                  Arrays.asList(dataSet));
  
          if (this.batchNotifier != null)
          {
              this.batchNotifier.notifyResult(dataSet);
          }
      }
docs: {@inheritDoc}