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
Schreibe einen Kommentar