Как найти сумму в Java 8 на основе свойства объекта - PullRequest
0 голосов
/ 18 октября 2018

У меня есть класс, определенный следующим образом:

public class Item {

    String name;
    double price;
}

Теперь у меня есть список объектов Item, теперь я хочу найти общую цену для всех предметов.Как мы можем сделать это в Java 8?

Если список состоит из простых целых чисел, у нас есть решение, данное здесь - Как суммировать список целых чисел с потоками Java?

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Сначала добавьте методы доступа:

public class Item {
    String name;
    double price;

    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }
}

Затем выполните цикл по Item s и сложите их price s вместе:

double totalPrice = 0.0;
for (final Item item : itemList) {
    totalPrice += item.getPrice();
}
System.out.printf("The total price is $%.2f.\n", totalPrice);
0 голосов
/ 18 октября 2018

Почему вы не используете 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)

0 голосов
/ 18 октября 2018

Вы можете сопоставить Item s с их ценами:

List<Item> items = ...;
double sum = items.stream().mapToDouble(Item::getPrice).sum();
...