どのように私は、java 8ストリームAPIを使用して私のコードを変換することができますか?

マンゴー:

私は、ゲームの成果の一連の統計情報をプリントアウトするための簡単な方法を書いています。すべてのゲームは、ゲームの結果に応じて、列挙型が含まれていることでアウトカムのリストを持っています。私のインストラクターは、私のコードで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()));

そして、取得winloseカウント:

long win = map.get(Outcomes.WIN);
long lose = map.get(Outcomes.LOSE);
...

取得するにallは、マップのすべての値を合計する必要が数えます

long all = map.values().stream()
    .mapToLong(Long::valueOf)
    .sum();

おすすめ

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