-2
votes

Utilisation de Lambda Expression dans Java 8

Je veux refroidir ce code pour utiliser Lambda Expression Java 8

for(int i = 0; i < customers.getCUSTOMER().size(); i++){
   if (customers.getCUSTOMER().get(i).getINCOME().getGROSSMONTH1().toBigInteger()
     < customers.getCUSTOMER().get(i).getINCOME().getNETTSALMONTH1().toBigInteger()){

        log.error("")
        throw new RuntimeException();
   }
}


6 commentaires

Dupliqué possible de Fonction Java 8 Lambda qui jette une exception?


@Paul - C'est une exception décochée, il n'y a donc aucun problème à le jeter.


Au fait, vous ne pouvez pas comparer biginteger en utilisant << / code>


D'accord, donc clients.getcustomer (). Stream (). Filtre (C -> C.Getincome (). GetgrossMonth1 (). Tobiginteger (). Catégorie (). Getnettsal Month1 (). .Tobigintege r ()) == -1) .Findany (). Ifpresent (c -> {jetez Nouvelle RunTimeException ();}); devrait suffire.


@Stephenc i d'abord les convertit en Integer puis utilisez <, quelle est la bonne façon de vérifier si plus grand que d'utiliser BigInteger


Utilisez la méthode comparète. Mais avez-vous vraiment besoin d'utiliser BigInteger du tout? Vous attendez-vous vraiment à soutenir les revenus> 9.223372e + 18 cents?


5 Réponses :


0
votes
customers.getCUSTOMER().stream().forEach(customer -> {
    if(customer.getINCOME().getGROSSMONTH1().toBigInteger() < customer.getINCOME().getNETTSALMONTH1().toBigInteger()){
      log.error("");
      throw new RuntimeException();
    }
});
You should also try renaming your methods using camelcase, e.g getIncome() to make it easier to read and conform to normal Java writing standards. 

0 commentaires

0
votes
  customers.stream().filter(customer ->    
            customer.getINCOME().getGROSSMONTH1().toBigInteger() < 
             customer.getINCOME().getNETTSALMONTH1().toBigInteger())
       .findAny().ifPresent(c -> {
           log.error("")
           throw new RuntimeException();
    });;

0 commentaires

0
votes

Vous êtes itération sur les éléments de clients.getCustomer () , qui semble être une liste (et je suppose aux fins de cette réponse qu'il est un ). Vraisemblablement, alors, vous allez traiter que le flux de cette liste: xxx

vous utilisez le getincome () de chaque élément deux fois, et pas d'autre aspect De tout, vous voulez peut-être cartographier des éléments via cette méthode. Suppolant que les éléments de la liste des clients sont de type client , qui pourrait être xxx

Il existe différentes façons d'aller de là, mais depuis que vous «Je lance une exception lorsqu'une condition est satisfaite, j'irais personnellement avec flux.anyMatch () : xxx

qui produit un résultat booléen Cela vous dit si un élément satisfait à la condition, et cela cesse de regarder dès qu'il en trouve un (et le prédicat pour le AnyMatch () est une Lambda). Vous l'utiliseriez dans un si expression similaire à celui que vous avez maintenant: xxx

puisque vous lancez un runtimédiexception , il serait également possible de le faire avec une Lambda, à l'intérieur du flux, mais c'est pas généralement possible si vous lancez une exception vérifiée. Dans le cas à l'exception vérifiée, quelque chose le long des lignes présenté ici est généralement nécessaire.

D'autre part, si vous souhaitez enregistrer des informations sur l'élément qui a échoué, vous devez le faire à l'intérieur du flux. . De plus, dans ce cas, vous voudrez peut-être ignorer la carte () . Vous pouvez au contraire filtre () en fonction du prédicat et FindFirst () parmi les éléments, le cas échéant, restant (ou Findery () si Vous ne vous souciez pas de savoir si c'est le premier que vous rapportez). Le résultat est un en option , que vous pouvez traiter, le cas échéant, avec un autre lambda: xxx

Notez que cela ne résout pas l'exception vérifiée problème. Vous ne pouvez pas lancer une exception vérifiée de l'intérieur du ifpresent lambda.


0 commentaires

0
votes

à l'aide des flux Java-8, utilisez Filtre Code> pour condition et FindFirst code> pour terminer après une correspondance

customers.getCUSTOMER().stream()
                       .filter(c->c.getINCOME().getGROSSMONTH1().toBigInteger() < c.getINCOME().getNETTSALMONTH1().toBigInteger())
                       .findFirst()
                       .ifPresent(cu->{
                               log.error("")
                               throw new RuntimeException();
                           });


0 commentaires

0
votes

Ce dont vous avez besoin dans ce cas est un bipredicate code> qui ressemblera à ce xxx pré>

puis utilisez-le comme suit cette p>

boolean shouldThrowException = customers.getCUSTOMER()
                                        .stream()
                                        .anyMatch(cust -> {
                                            TypeOfMonth tom1 = getINCOME().getGROSSMONTH1();
                                            TypeOfMonth tom2 = getINCOME()..getNETTSALMONTH1();
                                            return biPredicate.test(tom1, tom2);
                                        });

if (shouldThrowException) {
    log.error("");
    throw new RuntimeException();
}


0 commentaires