Я относительно новичок в Java 8 и пытаюсь обвести вокруг себя потоки. У меня есть запрос из базы данных, которая возвращает следующее:Пересмотреть и отобразить элементы из списка
String companyName |
String clientName |
BigDecimal amount |
String transactionType (either credit or debit) |
long numberOfTransactions
хранить каждую строку в этом объекте, используя значение поля transactionType, чтобы определить, какие из creditAmount или debitAmount количество заполняется
public RowForCsv{
private String companyName;
private String customerName;
private BigDecimal creditAmount;
private BigDecimal debitAmount;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((companyName == null) ? 0 : companyName.hashCode());
result = prime * result + ((customerName == null) ? 0 : customerName.hashCode());
return result;
}
}
мне нужно использовать эти данные, чтобы сделать отдельные файлы CSV для операций, связанных с каждым именем компании, в конечном счете, смысл я хотел бы
`Map<String companyName, List<RowForCsv> associatedTransactions>`
Поскольку клиенты могут выдавать как кредиты, так и дебет, я также хотел бы объединить отдельные объекты RowForCsv с теми же именами клиентов и компаний в один объект RowForCsv.
Вот что я пробовал:
//Get Map<name, list of transactions>
Map<String, List<ReconciliationRecordForCsv>> mapByCompanyName = records.stream().collect(Collectors.groupingBy(ReconciliationRecordForCsv::getCompanyName));
// Merge duplicates
mapByCompanyName.replaceAll((k, v) -> {
v.stream().collect(Collectors.collectingAndThen(
Collectors.groupingBy(RowForCsv::hashCode),
Collectors.collectingAndThen(Collectors.reducing((a, b) -> mergeCreditAndDebitRecords(a, b)), Optional::get)),
m -> new ArrayList<>(m.values()));
});
Это моя функция слияния, которую я думаю, что я неправильно понял концепцию ...
private RowForCsv mergeCreditAndDebitRecords(RowForCsv first, RowForCsv second) {
RowForCsv.Builder merged = new RowForCsv.Builder();
return merged.companyName(first.getCompanyName())
.customerName(first.getCustomerName())
.creditAmount(getLarger(first.getCreditAmount(), second.getCreditAmount()))
.debitAmount(getLarger(first.getDebitAmount(), second.getDebitAmount()))
.build();
}
На данный момент я нахожусь получая ошибки, связанные с заменой всех (k, v), не имеющих типов, collectAndThens все бросают ошибки, связанные с их цепочкой, а функция слияния недопустима для типов (Object, Object).
У меня такое чувство, что я подхожу к этому неправильно, но я не понимаю, что я должен делать по-другому, и любое руководство было бы очень благодарно.