在Java中重构私有实用程序方法

在Java中重构私有实用程序方法,java,junit,java-stream,refactoring,Java,Junit,Java Stream,Refactoring,我试图在Java中重构两个基本相同的私有方法。我目前正在做一些关于足球决胜局的JUnit测试断言,并编写了一个实用方法,通过结果流,返回一支球队的得分或失球总数。它们非常相似: private Integer getTeamGoalsScored(final LeagueTable leagueTable, final Team team) { return leagueTable.getAllResults().stream() .fil

我试图在Java中重构两个基本相同的私有方法。我目前正在做一些关于足球决胜局的JUnit测试断言,并编写了一个实用方法,通过结果流,返回一支球队的得分或失球总数。它们非常相似:

    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);
    }

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

您可以提取进行筛选和映射的函数。并在此函数中将其作为参数传递:

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);
    }
更新 正如注释中提到的
ToIntFunction
谓词
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();
    }
private Integer getSum(最终联赛),
谓词过滤器函数,ToIntFunction mapFun
) {
返回leagueTable.getAllResults().stream()
.filter(filterFun)
.map(结果::GetOutput)
.mapToInt(mapFun.sum();
}

哪些是
结果::GetGoalsScoredByMeteam
结果::GetGoalsScoredByWayTeam
的签名?您可以将
函数更改为
ToInFunction
并替换
.map(mapFun)。使用
.mapToInt(mapFun).sum()减少(0,Integer::sum)
。而且很可能是
函数filterFun
带有
谓词
private Integer getSum(final LeagueTable leagueTable, 
   Predicate<Result> filterFun, ToIntFunction<Outcome> mapFun 
) {
        return leagueTable.getAllResults().stream()
                .filter(filterFun)
                .map(Result::getOutcome)
                .mapToInt(mapFun).sum();
    }