Почему вы не используете Double?У него есть методы sum()
, которые могут быть решением для вас.
Пример кода:
class Entry {
Double value;
public Entry(Double value) {
this.value = value;
}
}
List<Entry> exampleList = new ArrayList<>();
for (int i = 0; i < 10; i++) { // Populate list
exampleList.add(new Entry(10d));
}
Double sum = 0d;
for (Entry entry : exampleList) { //Sum up values
Double.sum(sum, entry.value);
}
System.out.println(sum);
РЕДАКТИРОВАТЬ
Почему вы не должны зависетьна обёртывание примитивов (автобокс) и объявление класса Wrapper напрямую
tldr;
Хранение значений в примитивах и использование коллекции менее эффективно, чем объявление переменной в качестве оберткиКЛАСС В 1-ом МЕСТЕ
Как мы можем прочитать в документации Java ЗДЕСЬ , каждый раз, когда вы используете get()
или set()
для сбора с использованием примитива, будут происходить автобокс или распаковка, значительно снижая производительность.
Так когда следует использовать автобокс и распаковку?Используйте их только тогда, когда существует «несоответствие импеданса» между ссылочными типами и примитивами, например, когда вам нужно поместить числовые значения в коллекцию.Не рекомендуется использовать автобокс и распаковку для научных вычислений или другой чувствительный к производительности числовой код.Integer не является заменой для int;Автобокс и распаковка стирают различие между примитивными типами и ссылочными типами, но они не устраняют его.
Другие подводные камни, использующие автобокс
- Обналичивание класса Wrapper
Как вы можете прочитать в JavaDoc
Если значение p в штучной упаковке равно true, false, abyte, или char в диапазоне от \ u0000 до \ u007f, или int или короткое число от -128 до 127 (включительно), тогда пусть r1 и r2 будут результатами любых двух преобразований p.Это всегда тот случай, когда r1 == r2.
В соответствии с этой строкой, подумайте, что будет выводом
public class AutoboxingNotSoCool {
public static void main(String[] args) {
System.out.println(Integer.valueOf("-129") == (Integer.valueOf("-129")));
System.out.println(Integer.valueOf("100") == (Integer.valueOf("100")));
}
}
Результат:
false
true
(Обратите внимание, что вы не должны НИКОГДА сравнивать два объекта, используя ==
)
- Вам необходимо явно объявить тип числа
Давайте посмотрим на этот маленький кусочек кода.
public class AutoboxingNotSoCool {
public static void main(String[] args) {
Float manifestlyDeclaredVariable = 2F;
System.out.println(manifestlyDeclaredVariable.equals(2));
System.out.println(manifestlyDeclaredVariable.equals(2F));
}
}
В результате это будет
false
true
И это потому, что 2 будет Autoboxed to Integer (2L будет Autoboxed to Long, 2F будет Autoboxed to Float)