1
votes

Renvoie facultatif au lieu de facultatif qui se trouve à l'intérieur

J'essaie d'écrire un flux qui renvoie l'employé le plus riche.

BigDecimal getAccountAmountInPLN(final Account account) {
    return account
            .getAmount()
            .multiply(BigDecimal.valueOf(account.getCurrency().rate))
            .round(new MathContext(4, RoundingMode.HALF_UP));
}

Ma méthode getAccounts () renvoie List

Ma méthode getAccountAmountInPLN code> ressemble à ceci:

Optional<User> getRichestEmployee() {
    return getUserStream()
        .flatMap(user -> user.getAccounts().stream())
        .map(this::getAccountAmountInPLN)
        .sorted(Comparator.reverseOrder())
        .findFirst();
}

Mon problème est que getRichestEmployee () renvoie Optional .

Je ne peux pas renvoyer l’employé le plus riche. Lors de l'exécution sur le flux, je perds l'accès aux objets User . Comment renvoyer un utilisateur?


3 commentaires

Pour trouver l'employé le plus riche (en supposant Utilisateur ?) , ne devriez-vous pas additionner les montants de tous les comptes d'employés? Je ne vois aucune tentative d'obtenir un solde total du compte pour l'employé. Repensez à ce que vous essayez de faire.


Pouvons-nous voir votre classe de compte?


@Andreas vous avez raison. Je dois donc résumer toutes les factures de chaque employé. (Je ne sais pas pourquoi je ne l'ai pas ajouté dans la question - cela résulte de plusieurs de mes éditions et tentatives dans cette méthode). @BenjaminUrquhart @Builder @Data classe publique Account {type de AccountType final privé; numéro de chaîne final privé; montant BigDecimal final privé; monnaie finale privée; }


3 Réponses :


-1
votes

Créez votre propre comparateur et ne mappez pas chaque compte à son solde:

Optional<User> getRichestEmployee() {
 return getUserStream()
    .flatMap(user -> user.getAccounts().stream())
    .sorted((a1, a2) -> this.getAccountAmountInPLN(a2).compareTo(this.getAccountAmountInPLN(a1)))
    // Assuming there's a getter for the account owner...
    .map(Account::getOwner) // replace with Account's getter for owner
    .findFirst();


1 commentaires

Account :: getOwner est une construction entièrement nouvelle du point de vue des données et peut ne pas être préservée. Je veux dire qu'il n'y a aucune information dans la question qui peut vous donner le propriétaire d'un compte.



3
votes

Je suppose que vous calculez la richesse de votre utilisateur en trouvant un compte avec le montant le plus élevé.

Commencez par créer une méthode supplémentaire pour obtenir un montant d'un utilisateur:

public BigDecimal getUserTotalAmount(User user) { //instead of getUserMaxAmount
    return user
            .getAccounts()
            .stream()
            .map(this::getAccountAmountInPLN)
            .reduce(BigDecimal.ZERO, BigDecimal::add);


1 commentaires

Merci pour votre idée et pour supposer que je dois compter la richesse de l'utilisateur en additionnant tous les montants.



2
votes

Premièrement, pour trouver l'employé le plus riche, vous devez additionner les montants des comptes de l'employé.

Deuxièmement, pour trouver l'employé avec le montant total le plus élevé, utilisez max (comparateur super T> comparateur)

Exemple :

Optional<User> getRichestEmployee() {
    return getUserStream()
            .max(Comparator.comparing(this::getEmployeeAmountInPLN));
}

BigDecimal getEmployeeAmountInPLN(final User user) {
    return user.getAccounts()
            .stream()
            .map(this::getAccountAmountInPLN)
            .reduce(BigDecimal.ZERO, BigDecimal::add);
}

BigDecimal getAccountAmountInPLN(final Account account) {
    return account
            .getAmount()
            .multiply(BigDecimal.valueOf(account.getCurrency().rate))
            .round(new MathContext(4, RoundingMode.HALF_UP));
}


0 commentaires