Próbuję się bawić w niemutowalość w javie i trafiłem na taki problem:
(system do obstawiania wyników meczy)
Mam PriorityQueue z wynikami użytkowników. Przychodzi do mnie lista zakładów i wynik meczu. Działanie powinno być takie:
-za poprawny zakład powinien dodać pkt, ewentualnie stworzyć urzytkownika i dodać pkt
-za niepoprawny nic nie robić, chyba że nie ma użytkownika to wtedy stworzyć go z wynikiem 0
Zabawa polega na tym, że staram się aby wszystko było final. Kod obecnie mam taki:
LeagueResults updateResults(MatchResult result, List<BetDTO> bets) {
List<BetDTO> correctBets = bets.filter(betDTO -> betDTO.getBetTyp().match(result));
List<UserResult> userResultsWithIncorrectBetNotInQueue = getUserResultsWithIncorrectBetNotInQueue(bets, correctBets);
List<UserResult> userResultsWithCorrectBetsNotInQueue = getUserResultsForBetsNotInQueue(correctBets);
PriorityQueue<UserResult> results = userResultPriorityQueue
.enqueueAll(userResultsWithCorrectBetsNotInQueue)
.map(userResult -> addPointsForCorrectBet(correctBets, userResult))
.enqueueAll(userResultsWithIncorrectBetNotInQueue);
return new LeagueResults(leagueUUID, results);
}
private UserResult addPointsForCorrectBet(List<BetDTO> correctBets, UserResult userResult) {
for (BetDTO bet : correctBets) {
if (userResult.hasName(bet.getUsername())) {
return userResult.addPoint();
}
}
return userResult;
}
private List<UserResult> getUserResultsWithIncorrectBetNotInQueue(List<BetDTO> bets, List<BetDTO> correctBets) {
return getUserResultsForBetsNotInQueue(bets.removeAll(correctBets));
}
private List<UserResult> getUserResultsForBetsNotInQueue(List<BetDTO> betsList) {
return betsList.filter(this::betNotInResultQueue).map(BetDTO::getUsername).map(this::createNewUserResult);
}
private boolean betNotInResultQueue(BetDTO betDTO) {
return userResultPriorityQueue.find(userResult -> userResult.hasName(betDTO.getUsername())).isEmpty();
}
private UserResult createNewUserResult(String user) {
LOGGER.log(Level.INFO, "Create new user with name: " + user);
return UserResult.create(user);
}
Pytanie czy da się to zrobić jakoś ładnie? 'funkcyjniej'? :P
Edit
Mam trochę problem z nazywaniem rzeczy. Może podać jakieś porady? ;)
Edit2
Używam list itp z vavr