2014-11-15 2 views
9

В C++, если я объявляю карту как станд :: карта мКак увеличить значение для конкретного ключа на карте в java?

то я могу увеличить значение для определенного ключа в карте таким образом

m[key]++ 

В Java я объявляю карту

Map<Integer, Integer> m = new HashMap<>(); 

и я увеличиваю значение для конкретного ключа таким образом:

m.put(key, m.get(key).intValue() + 1) 

Мой вопрос: есть ли ярлык или лучший способ сделать это?

+0

Вам не нужно вызвать метод intValue. Вы можете определить метод по вашему настроенному значению (целое число Integer/Double и т. Д. Неизменяемы в java) и могут сказать m.get (key) .increment(); – SMA

ответ

13

Вы можете использовать compute (Java 8+):

m.compute(key, (k, v) -> v + 1); 
+1

спасибо. Я кое-что изучил, что вы здесь сделали. этот тип выражения для меня очень новый. из моего исследования я не слишком понимал. было бы очень полезно, если бы вы дали простой пример с данным выражением. Я просмотрел эти [site_1] (http: // http: //radar.oreilly.com/2014/04/whats-new-in-java-8-lambdas.html) и [site_2] (http: // radar .oreilly.com/2014/08/java-8-functional-interfaces.html). – seal

6

Вам не нужен .intValue() из-за автобоксинга, но кроме того, нет лучшего способа сделать это.

m.put(key, m.get(key) + 1) 

Причина (или проблема) в том, что Java решили не выпускать классы реализуют свои собственные операторы (как это возможно в C++).

+0

Я думаю, что «лучший способ» относительный. Производительность и GC мудрый я бы поспорить для моего ответа. Минимальные зависимости и простота развертывания выигрывают. –

+0

Да, вы правы. С «нет лучшего способа» я имел в виду при использовании простой «Карта ». Ваше решение лучше, если использование 1: 1 'Map ' не является обязательным требованием. – Misch

2

Вы можете отказаться от вызова intValue и положиться на автоматическое распаковку.

6

Я всегда предпочитал использовать mutable int для решения этих проблем. Таким образом, код выглядит как ...

Это позволяет избежать ненужных накладных расходов (что мало).