Chcę użyć strumienia Java 8 i grupować według jednego klasyfikatora, ale mieć wiele funkcji kolektora. Zatem podczas grupowania obliczana jest na przykład średnia i suma jednego pola (lub może innego pola).Java 8 Strumień: grupowanie z wieloma kolektorami
Staram się uprościć to trochę na przykładzie:
public void test() {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Person One", 1, 18));
persons.add(new Person("Person Two", 1, 20));
persons.add(new Person("Person Three", 1, 30));
persons.add(new Person("Person Four", 2, 30));
persons.add(new Person("Person Five", 2, 29));
persons.add(new Person("Person Six", 3, 18));
Map<Integer, Data> result = persons.stream().collect(
groupingBy(person -> person.group, multiCollector)
);
}
class Person {
String name;
int group;
int age;
// Contructor, getter and setter
}
class Data {
long average;
long sum;
public Data(long average, long sum) {
this.average = average;
this.sum = sum;
}
// Getter and setter
}
Wynik powinien być mapa, która kojarzy wynik grupowania jak
1 => Data(average(18, 20, 30), sum(18, 20, 30))
2 => Data(average(30, 29), sum(30, 29))
3 => ....
To działa perfekcyjnie z jednej funkcji, takich jak "Collectors.counting()", ale lubię łączyć więcej niż jeden (najlepiej nieskończenie z Listą).
List<Collector<Person, ?, ?>>
Czy można zrobić coś takiego?
Czy dobrze rozumiem, że 'Data' klasa jest tylko zastępczy dla kolekcji flatmap-funkcji? Każda z tych funkcji musi wykonać tę samą operację na wszystkich grupach (np. Najpierw obliczyć grupy na wiek, po drugie całkowity wiek itp.)? –
Kiedy cię poprawiłem, tak myślę. Po prostu użyłem go do przechowywania wielu danych w jednym obiekcie, a jednocześnie mogłem zidentyfikować który jest który. Może to być tablica lub mapa z kluczem = nazwa funkcji, wartość = funkcjaRozmiar. – PhilippS