#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. Правильно. Я думал, что платная переменная имеет общее количество и что имена уникальны. Мой плохой. Ваш ответ правильный.