キット:
私は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]]