code: @Override
      public void compute() {
          if (!Double.isNaN(getValue())) {
              // since the data cannot change, avoid re-doing the calculations
              return;
          }
          iniCompute();
  
          Map<U, List<Double>> data = processDataAsPredictedDifferencesToTest();
          int testItems = 0;
          for (U testUser : getTest().getUsers()) {
              int userItems = 0;
              double umse = 0.0;
  
              if (data.containsKey(testUser)) {
                  for (double difference : data.get(testUser)) {
                      umse += difference * difference;
                      userItems++;
                  }
              }
  
              testItems += userItems;
              setValue(getValue() + umse);
              if (userItems == 0) {
                  umse = Double.NaN;
              } else {
                  umse = Math.sqrt(umse / userItems);
              }
              getMetricPerUser().put(testUser, umse);
          }
          if (testItems == 0) {
              setValue(Double.NaN);
          } else {
              setValue(Math.sqrt(getValue() / testItems));
          }
      }
docs: Instantiates and computes the RMSE value. Prior to running this, there is
  no valid value.