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