Java 8 Lambdas - Wie Summe und Durchschnitt aus einem stream
Ist es möglich, Summe und Durchschnitt und zu transformieren, um ein neues Objekt aus einem stream .
Ich habe ein Objekt
public class Foo {
private String code;
private double price;
....
}
Nun möchte ich, um die Durchschnittliche und die Summe dieser Objektliste ( Summe Preis von code und Durchschnittspreis von code als auch)
foos = Arrays.asList(
new Foo("MTN" , 200 ),
new Foo("MTN" , 210 ),
new Foo("MTN" , 205 ),
new Foo("OMT" , 300 ),
new Foo("OMT" , 320 ),
new Foo("OMT" , 310 ),
new Foo("AAA" , 650 ),
new Foo("AAA" , 680 ),
new Foo("AAA" , 600 ));
Ich würde dann wollen, erstellen Sie ein neues Objekt (FooB
public class FooB {
private String code;
private double total;
private double average;
....
}
Dies ist, was ich jetzt habe es funktioniert, aber ich gehe durch den Strom zweimal . Ich möchte eine Methode, wo ich dies tun kann, indem der Strom einmal .
Map<String, Double> averagePrices = foos.stream()
.collect(
Collectors.groupingBy(
Foo::getCode,Collectors.averagingDouble(Foo::getPrice)));
Map<String, Double> totalPrices = foos.stream()
.collect(
Collectors.groupingBy(
Foo::getCode,
Collectors.summingDouble(Foo::getPrice)));
List<FooB > fooBs = new ArrayList<>();
averagePrices.forEach((code, averageprice)-> {
FooB fooB = new FooB (code , totalPrices.get(code) , averageprice);
fooBs.add(fooB );
});
fooBs.forEach(e -> System.out.println(e.toString()));
Gibt es einen besseren Weg, dies zu tun, ohne das zu wiederholen . Dank
- Sie könnten einen eigenen Sammler - Klasse, die gibt
FooB
Objekte
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie
DoubleSummaryStatistics
halten, um sowohl die Ergebnisse, bevor die Zuordnung zuFooB
: