Java: суммирование данных с потоками

#java #list #filter #stream

#java #Список #Фильтр #поток

Вопрос:

Возможно ли суммировать значения с потоками? Например, у меня есть класс Dataset, который разделяет csv-файл для меня на строки, содержащие значения:

 {customer=Max , articlenr=1234, paid=12}
{customer=Lisa , articlenr=21, paid=20}
{customer=Max , articlenr=19, paid=100}
 

Теперь я хочу создать список с потоком, который возвращает мне список моих клиентов (без других значений), отсортированных по сумме, которую они когда-либо платили (в этом примере Макс заплатил 112, а Лиза 20).).
Поэтому я ожидал бы получить Max первым в списке и Lisa.

Комментарии:

1. Вам нужно только поле «клиент», так что список похож ["Max", "Lisa"] ?

2. Это правильно. Итак, если Лиза заплатила больше, чем Макс, я хотел бы получить [«Lisa», «Max»]

Ответ №1:

Соберите сумму paid в a Map<String, Integer> , затем передайте записи, отсортировав их в обратном порядке по платности, затем соберите ключи к a List .

 List<MyClass> records; // your list

List<String> customers = records.stream()
        .collect(groupingBy(MyClass::getCustomer, Collectors.summingInt(MyClass::getPaid)))
        .entrySet().stream()
        .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
        .map(Map.Entry::getKey)
        .collect(toList());
 

Ответ №2:

Да, это возможно:

 public class Customer {
    private String name;
    private int articlenr;
    private int paid;
}
 

Теперь вы можете использовать это, чтобы получить список имен, упорядоченных по сумме, оплаченной в первую очередь:

 List<String> names = customerList.stream().sorted(Comparator.comparing(Customer::getPaid)).map(Customer::getName).collect(Collectors.toList());
 

Здесь я несколько дней назад написал статью о том, как использовать потоки, и еще несколько примеров: http://petrepopescu.tech/2021/01/simple-collection-manipulation-in-java-using-lambdas /

Комментарии:

1. Это полностью упускает суть вопроса. Это возвращает каждую запись, отсортированную по платности, так что вы получите ["Max", "Lisa", "Max"] , но OP хочет ["Max", "Lisa"] — каждое имя после сортировки по общему количеству оплаченных от самого высокого до самого низкого.

2. Правильно. Я думал, что платная переменная имеет общее количество и что имена уникальны. Мой плохой. Ваш ответ правильный.