junit—在java中重构私有实用程序方法

9fkzdhlc  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(387)

我正在尝试重构java中两个基本上相同的私有方法。我目前正在做一些junit测试Assert的足球平局,并已编写了一个实用的方法,通过流式处理结果,并带回总进球得分或失球的一支球队。它们非常相似:

private Integer getTeamGoalsScored(final LeagueTable leagueTable, final Team team) {
        return leagueTable.getAllResults().stream()
                .filter(t -> t.getHomeTeam().equals(team))
                .map(Result::getOutcome)
                .map(Outcome::getGoalsScoredByHomeTeam).reduce(0, Integer::sum) +
                leagueTable.getAllResults().stream()
                        .filter(t -> t.getAwayTeam().equals(team))
                        .map(Result::getOutcome)
                        .map(Outcome::getGoalsScoredByAwayTeam).reduce(0, Integer::sum);
    }

    private Integer getTeamGoalsAgainst(final LeagueTable leagueTable, final Team team) {
        return leagueTable.getAllResults().stream()
                .filter(t -> t.getHomeTeam().equals(team))
                .map(Result::getOutcome)
                .map(Outcome::getGoalsScoredByAwayTeam).reduce(0, Integer::sum) +
                leagueTable.getAllResults().stream()
                        .filter(t -> t.getAwayTeam().equals(team))
                        .map(Result::getOutcome)
                        .map(Outcome::getGoalsScoredByHomeTeam).reduce(0, Integer::sum);
    }

正如您所看到的,它们基本上是样板,我想知道如何将这两种方法合并为一种方法。我猜布尔值是真/假,得分/反对?

k75qkfdt

k75qkfdt1#

您可以提取进行过滤和Map的函数。并在此函数中作为参数传递:

private Integer getSum(final LeagueTable leagueTable, 
   Function<Result, Boolean> filterFun, Function<Outcome, Integer> mapFun 
) {
        return leagueTable.getAllResults().stream()
                .filter(filterFun)
                .map(Result::getOutcome)
                .map(mapFun).reduce(0, Integer::sum);
    }

然后你可以在你的代码中使用:

private Integer getTeamGoalsScored(final LeagueTable leagueTable, final Team team) {
    return getSum(leagueTable,
            t -> t.getHomeTeam().equals(team), Outcome::getGoalsScoredByHomeTeam) + 
           getSum(leagueTable,
            t -> t.getAwayTeam().equals(team), Outcome::getGoalsScoredByAwayTeam);
}

更新

正如在评论中提到的那样 ToIntFunction 以及 Predicate ; getSum 可以这样写:

private Integer getSum(final LeagueTable leagueTable, 
   Predicate<Result> filterFun, ToIntFunction<Outcome> mapFun 
) {
        return leagueTable.getAllResults().stream()
                .filter(filterFun)
                .map(Result::getOutcome)
                .mapToInt(mapFun).sum();
    }

相关问题