Есть ли способ избежать введения временного TreeRangeSet в методе? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть карта с метриками по умолчанию, и я хочу периодически обновлять ее новыми полученными метриками. Так что я вычисляю максимальный диапазон и добавляю его в 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));
}
...