Operowanie na dwóch niemutowalnych listach

0

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

0
return correctBets
                .stream()
                .filter(bet -> userResult.hasName(bet.getUsername()))
                .findFirst()
                .map( bet -> userResult.addPoint() )
                .orElse(userResult);

Coś takiego np. nie będzie działać zamiast addPointsForCorrectBet(List<BetDTO> correctBets, UserResult userResult)?

0

Tu jest ciekawy artykuł odnośnie niemutowalnych kolekcji i map w javie 9 i javie 10:
https://dzone.com/articles/java-collections-are-evolving

0

@Pinek: tylko że te nie mutowalne kolekcje mają wade o których wspomniał @jarekr000000. Generalnie kolekcje z VAVRa sa troche jak Stringi - mozesz np. zrobić toLowerCase() ale to zwróci nowego Stringa, stary będzie jaki był :)
Tak samo właśnie działają kolekcje w VAVR - dodajesz element, to tworzona jest nowa lista, a stara nie jest zmieniona. Oczywiście to jest jakoś sprytnie robione żeby nie kopiowac calości, ale to już szczegół implementacyjny ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1