У меня есть список объектов транзакции, как показано ниже:
List<Transaction> transactions = Arrays.asList(
new Transaction(brian, 2011, 300, "X", "M1"),
new Transaction(raoul, 2012, 1000, "T", "M1"),
new Transaction(raoul, 2011, 400, "S", "M2"),
new Transaction(mario, 2012, 710, "X", "M1"),
new Transaction(mario, 2012, 700, "X", "M2"),
new Transaction(alan, 2012, 950, "T", "M1")
);
Класс транзакции:
class Transaction {
private final Trader trader;
private final int year;
private final int value;
private String type;
private String method;
}
Теперь мне нужно найти среднее значение в зависимости от типа транзакции для каждой группы и, наконец, выгрузить среднее значение в объект Result
с некоторыми дополнительными данными о группе, среднее значение которой вычисляется et c.
перед вычислением. в списке выполняются следующие операции:
- группировка транзакции по году
- затем группировка по методу
и конечный созданный объект должен иметь среднее значение, год и значение метода в нем.
Класс результата:
class Result {
private Double avg;
private int year;
private String method;
}
Код:
Map<Integer, Map<String, Result>> res = transactions.stream().collect(
groupingBy(Transaction::getYear,
groupingBy(Transaction::getMethod),
collectingAndThen( averagingDouble( t -> "X".equals(t.getType()) ? 1: 0 ),
v -> new Result(v, GROUP_METHOD? , GROUP_YEAR?))
)
);
Но значения GROUP_METHOD и GROUP_YEAR здесь недоступны в зависимости от группировки выполняется, поскольку averagingDouble()
производит двойное, и вся остальная информация теряется в этом сопоставлении.
есть ли способ получить эти поля или правильно отобразить результат в объект?