マンゴー:
私は、ゲームの成果の一連の統計情報をプリントアウトするための簡単な方法を書いています。すべてのゲームは、ゲームの結果に応じて、列挙型が含まれていることでアウトカムのリストを持っています。私のインストラクターは、私のコードでTODOをコメントしています:
public static void printStatistics(List<Game> games) {
float win = 0;
float lose = 0;
float draw = 0;
float all = 0;
//TODO: should be implemented /w stream API
for (Game g : games) {
for (Outcome o : g.getOutcomes()) {
if (o.equals(Outcome.WIN)) {
win++;
all++;
} else if (o.equals(Outcome.LOSE)) {
lose++;
all++;
} else {
draw++;
all++;
}
}
}
DecimalFormat statFormat = new DecimalFormat("##.##");
System.out.println("Statistics: The team won: " + statFormat.format(win * 100 / all) + " %, lost " + statFormat.format(lose * 100 / all)
+ " %, draw: " + statFormat.format(draw * 100 / all) + " %");
}
私は、ラムダ式に精通しています。私は解決策をオンライン探してみましたが、クラスのフィールドのフィールドにアクセスするストリームの例を見つけることができませんでした。あなたが私に解決策を与える、または関連するチュートリアルを私に提供することができれば、私は幸せになります。ありがとうございました。
ルスラン:
groupingBy
この場合に適合:
Map<Outcome, Long> map = games.stream()
.flatMap(game -> game.getOutcomes().stream())
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
そして、取得win
、lose
カウント:
long win = map.get(Outcomes.WIN);
long lose = map.get(Outcomes.LOSE);
...
取得するにall
は、マップのすべての値を合計する必要が数えます
long all = map.values().stream()
.mapToLong(Long::valueOf)
.sum();