二つの特性上のJava 8スチームグループ化し、第三財産の平均取得

キット:

私は1つのArrayListにクラスオブジェクトの下にあります。

new Pojo("Football","M",1000)
new Pojo("Football","M",1000)
new Pojo("Cricket","F",500)
new Pojo("Cricket","F",1500)
new Pojo("Cricket","M",500)
new Pojo("Cricket","M",500)

私は、「ジェンダー」に関して、「スポーツ」の平均点を取得したいです。私は、Java 8つのストリームに出くわし、ここでそれを使用するのは良いですが、私はそれを実装するのか分からないように思えます。

私は以下のようにそれを試してみました:

Map<Object,Long> mp = pojoList.stream().collect(Collectors.groupingBy(p -> p.sport,Collectors.counting()));

それはカウント私にスポーツを与え、良い作業だが、私は男女の1つの以上のフィルタを適用し、平均点を取得したいです。

私が欲しいの出力:

new PojoOutput("Football","M",1000)
new PojoOutput("Cricket","F",1000)
new PojoOutput("Cricket","M",500)
ernest_k:

あなたは2つの使って、マップにグループ化することができgroupingBy:呼び出しを、彼らは他の下流であることの一つは、

Map<String, Map<String, Double>> res = pojos.stream()
    .collect(Collectors.groupingBy(Pojo::getSport,
            Collectors.groupingBy(Pojo::getGender, 
                                  Collectors.averagingDouble(i -> i.getPoints()))));

この結果では{Cricket={F=1000.0, M=500.0}, Football={M=1000.0}}、あなたが簡単に変換することができ、Pojoこのようなものを使用して、インスタンス:

List<Pojo> groups = result.entrySet()
        .stream()
        .flatMap(sport -> sport.getValue()
                        .entrySet().stream()
                        .map(gender -> new Pojo(sport.getKey(), 
                                                gender.getKey(), 
                                                gender.getValue())))
        .collect(Collectors.toList());

生成されたとの結果toString

[Pojo [sport=Cricket, gender=F, points=1000.0], 
 Pojo [sport=Cricket, gender=M, points=500.0], 
 Pojo [sport=Football, gender=M, points=1000.0]]

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=186163&siteId=1