如何解决重构Java中的私有实用程序方法 更新
我正在尝试重构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);
}
然后您可以在代码中使用以下代码:
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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。