У меня есть карта с метриками по умолчанию, и я хочу периодически обновлять ее новыми полученными метриками. Так что я вычисляю максимальный диапазон и добавляю его в TreeRangeSet. А затем поместите обновленный TreeRangeSet на карту для данной транзакции.
Однако я застрял при его реализации. И я не уверен, что было бы неплохо представить newRangeSet
. Но есть ли способ избежать этого в этом случае?
private static Map<String, TreeRangeSet<Long>> DEFAULT_MAP = new HashMap<>();
// A TreeRangeSet to store MAX metric for a transaction
TreeRangeSet<Long> tempRangeSet = TreeRangeSet.create();
JSONObject jsonObject = (JSONObject) obj;
String transactionName = (String)jsonObject.get("transaction");
Long metric_1= parseMetric(jsonObject);
Long metric_2 = parseMetric(jsonObject);
// A TreeRangeSet with actual current metrics for the transaction
// There could be 0 or more values
TreeRangeSet<Long> rangeSet = DEFAULT_MAP.get(transactionName);
Range<Long> rangeFromApi = Range.closed(metric_1, metric_2);
// Add newly received metric
rangeSet.add(rangeFromApi);
// Calculate max Range
Range<Long> max = calculateMaxRange(rangeSet).orElse(rangeFromApi);
// Add it into the temp TreeRangeSet
tempRangeSet.add(max);
// Put tempRangeSet to the DEFAULT_MAP
DEFAULT_MAP.put(transactionName, tempRangeSet);
// A method to calculate Max range from a TreeRangeSet
private static Optional<Range<Long>> calculateMaxRange(TreeRangeSet<Long> rs) {
Set<Range<Long>> ranges = rs.asRanges();
return ranges.stream().max(Comparator.comparing(Range::upperEndpoint));
}